From 99846da77f960a72d615c82bf5c5881a2df83616 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Thu, 11 Oct 2012 09:42:59 +0900 Subject: Conversion to gettext to allow localization This is just the first step - convert the string literals, try to catch all the places where this isn't possible and the program needs to convert string constants at runtime (those are the N_ macros). Add a very rough first German localization so I can at least test what I have done. Seriously, I have never used a localized OS, so I am certain that I have many of the 'standard' translations wrong. Someone please take over :-) Major issues with this: - right now it hardcodes the search path for the message catalog to be ./locale - that's of course bogus, but it works well while doing initial testing. Once the tooling support is there we just should use the OS default. - even though de_DE defaults to ISO-8859-15 (or ISO-8859-1 - the internets can't seem to agree) I went with UTF-8 as that is what Gtk appears to want to use internally. ISO-8859-15 encoded .mo files create funny looking artefacts instead of Umlaute. - no support at all in the Makefile - I was hoping someone with more experience in how to best set this up would contribute a good set of Makefile rules - likely this will help fix the first issue in that it will also install the .mo file(s) in the correct place(s) For now simply run msgfmt -c -o subsurface.mo deutsch.po to create the subsurface.mo file and then move it to ./locale/de_DE.UTF-8/LC_MESSAGES/subsurface.mo If you make changes to the sources and need to add new strings to be translated, this is what seems to work (again, should be tooled through the Makefile): xgettext -o subsurface-new.pot -s -k_ -kN_ --add-comments="++GETTEXT" *.c msgmerge -s -U po/deutsch.po subsurface-new.pot If you do this PLEASE do one commit that just has the new msgid as changes in line numbers create a TON of diff-noise. Do changes to translations in a SEPARATE commit. - no testing at all on Windows or Mac It builds on Windows :-) Signed-off-by: Dirk Hohndel --- dive.c | 3 +- divelist.c | 60 ++-- equipment.c | 53 +-- file.c | 7 +- gtk-gui.c | 143 ++++---- info.c | 65 ++-- libdivecomputer.c | 1 + main.c | 22 +- parse-xml.c | 5 +- po/deutsch.po | 971 +++++++++++++++++++++++++++++++++++++++++++++++++++++ print.c | 33 +- profile.c | 1 + statistics.c | 79 ++--- time.c | 1 + uemis-downloader.c | 24 +- uemis.c | 37 +- 16 files changed, 1255 insertions(+), 250 deletions(-) create mode 100644 po/deutsch.po diff --git a/dive.c b/dive.c index 641e1eda8..85b2f3b04 100644 --- a/dive.c +++ b/dive.c @@ -2,6 +2,7 @@ /* maintains the internal dive list structure */ #include #include +#include #include "dive.h" @@ -614,7 +615,7 @@ static char *merge_text(const char *a, const char *b) res = malloc(strlen(a) + strlen(b) + 9); if (!res) return (char *)a; - sprintf(res, "(%s) or (%s)", a, b); + sprintf(res, _("(%s) or (%s)"), a, b); return res; } diff --git a/divelist.c b/divelist.c index 3272cdfdc..baef39696 100644 --- a/divelist.c +++ b/divelist.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "divelist.h" #include "dive.h" @@ -1254,18 +1255,18 @@ static struct divelist_column { int *visible; } dl_column[] = { [DIVE_NR] = { "#", nr_data_func, NULL, ALIGN_RIGHT | UNSORTABLE }, - [DIVE_DATE] = { "Date", date_data_func, NULL, ALIGN_LEFT }, + [DIVE_DATE] = { N_("Date"), date_data_func, NULL, ALIGN_LEFT }, [DIVE_RATING] = { UTF8_BLACKSTAR, star_data_func, NULL, ALIGN_LEFT }, - [DIVE_DEPTH] = { "ft", depth_data_func, NULL, ALIGN_RIGHT }, - [DIVE_DURATION] = { "min", duration_data_func, NULL, ALIGN_RIGHT }, + [DIVE_DEPTH] = { N_("ft"), depth_data_func, NULL, ALIGN_RIGHT }, + [DIVE_DURATION] = { N_("min"), duration_data_func, NULL, ALIGN_RIGHT }, [DIVE_TEMPERATURE] = { UTF8_DEGREE "F", temperature_data_func, NULL, ALIGN_RIGHT, &visible_cols.temperature }, - [DIVE_TOTALWEIGHT] = { "lbs", weight_data_func, NULL, ALIGN_RIGHT, &visible_cols.totalweight }, - [DIVE_SUIT] = { "Suit", NULL, NULL, ALIGN_LEFT, &visible_cols.suit }, - [DIVE_CYLINDER] = { "Cyl", NULL, NULL, 0, &visible_cols.cylinder }, + [DIVE_TOTALWEIGHT] = { N_("lbs"), weight_data_func, NULL, ALIGN_RIGHT, &visible_cols.totalweight }, + [DIVE_SUIT] = { N_("Suit"), NULL, NULL, ALIGN_LEFT, &visible_cols.suit }, + [DIVE_CYLINDER] = { N_("Cyl"), NULL, NULL, 0, &visible_cols.cylinder }, [DIVE_NITROX] = { "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, nitrox_sort_func, 0, &visible_cols.nitrox }, - [DIVE_SAC] = { "SAC", sac_data_func, NULL, 0, &visible_cols.sac }, - [DIVE_OTU] = { "OTU", otu_data_func, NULL, 0, &visible_cols.otu }, - [DIVE_LOCATION] = { "Location", NULL, NULL, ALIGN_LEFT }, + [DIVE_SAC] = { N_("SAC"), sac_data_func, NULL, 0, &visible_cols.sac }, + [DIVE_OTU] = { N_("OTU"), otu_data_func, NULL, 0, &visible_cols.otu }, + [DIVE_LOCATION] = { N_("Location"), NULL, NULL, ALIGN_LEFT }, }; @@ -1998,8 +1999,12 @@ static void delete_dive_cb(GtkWidget *menuitem, GtkTreePath *path) static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int button, GdkEventButton *event) { GtkWidget *menu, *menuitem, *image; - char editlabel[] = "Edit dives"; - char deletelabel[] = "Delete dives"; + char editplurallabel[] = N_("Edit dives"); + char editsinglelabel[] = N_("Edit dive"); + char *editlabel; + char deleteplurallabel[] = N_("Delete dives"); + char deletesinglelabel[] = N_("Delete dive"); + char *deletelabel; GtkTreePath *path, *prevpath, *nextpath; GtkTreeIter iter, previter, nextiter; int idx, previdx, nextidx; @@ -2011,7 +2016,7 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); menu = gtk_menu_new(); - menuitem = gtk_image_menu_item_new_with_label("Add dive"); + menuitem = gtk_image_menu_item_new_with_label(_("Add dive")); image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); g_signal_connect(menuitem, "activate", G_CALLBACK(add_dive_cb), NULL); @@ -2019,7 +2024,7 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int if (idx < 0) { /* mouse pointer is on a trip summary entry */ - menuitem = gtk_menu_item_new_with_label("Edit Trip Summary"); + menuitem = gtk_menu_item_new_with_label(_("Edit Trip Summary")); g_signal_connect(menuitem, "activate", G_CALLBACK(edit_trip_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); prevpath = gtk_tree_path_copy(path); @@ -2027,7 +2032,7 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int gtk_tree_model_get_iter(MODEL(dive_list), &previter, prevpath)) { gtk_tree_model_get(MODEL(dive_list), &previter, DIVE_INDEX, &previdx, -1); if (previdx < 0) { - menuitem = gtk_menu_item_new_with_label("Merge trip with trip above"); + menuitem = gtk_menu_item_new_with_label(_("Merge trip with trip above")); g_signal_connect(menuitem, "activate", G_CALLBACK(merge_trips_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } @@ -2037,12 +2042,12 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int if (gtk_tree_model_get_iter(MODEL(dive_list), &nextiter, nextpath)) { gtk_tree_model_get(MODEL(dive_list), &nextiter, DIVE_INDEX, &nextidx, -1); if (nextidx < 0) { - menuitem = gtk_menu_item_new_with_label("Merge trip with trip below"); + menuitem = gtk_menu_item_new_with_label(_("Merge trip with trip below")); g_signal_connect(menuitem, "activate", G_CALLBACK(merge_trips_cb), nextpath); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } } - menuitem = gtk_menu_item_new_with_label("Remove Trip"); + menuitem = gtk_menu_item_new_with_label(_("Remove Trip")); g_signal_connect(menuitem, "activate", G_CALLBACK(remove_trip_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } else { @@ -2050,8 +2055,11 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int /* if we right click on selected dive(s), edit or delete those */ if (dive->selected) { if (amount_selected == 1) { - deletelabel[strlen(deletelabel) - 1] = '\0'; - editlabel[strlen(editlabel) - 1] = '\0'; + deletelabel = _(deletesinglelabel); + editlabel = _(editsinglelabel); + } else { + deletelabel = _(deleteplurallabel); + editlabel = _(editplurallabel); } menuitem = gtk_menu_item_new_with_label(deletelabel); g_signal_connect(menuitem, "activate", G_CALLBACK(delete_selected_dives_cb), path); @@ -2061,12 +2069,12 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int g_signal_connect(menuitem, "activate", G_CALLBACK(edit_selected_dives_cb), NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } else { - deletelabel[strlen(deletelabel) - 1] = '\0'; + deletelabel = _(deletesinglelabel); menuitem = gtk_menu_item_new_with_label(deletelabel); g_signal_connect(menuitem, "activate", G_CALLBACK(delete_dive_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - editlabel[strlen(editlabel) - 1] = '\0'; + editlabel = _(editsinglelabel); menuitem = gtk_menu_item_new_with_label(editlabel); g_signal_connect(menuitem, "activate", G_CALLBACK(edit_dive_from_path_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); @@ -2077,7 +2085,7 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int int *indices = gtk_tree_path_get_indices(path); /* top level dive or child dive that is not the first child */ if (depth == 1 || indices[1] > 0) { - menuitem = gtk_menu_item_new_with_label("Create new trip above"); + menuitem = gtk_menu_item_new_with_label(_("Create new trip above")); g_signal_connect(menuitem, "activate", G_CALLBACK(insert_trip_before_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } @@ -2087,24 +2095,24 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int gtk_tree_path_prev(prevpath) && gtk_tree_model_get_iter(MODEL(dive_list), &previter, prevpath) && gtk_tree_model_iter_n_children(model, &previter)) { - menuitem = gtk_menu_item_new_with_label("Add to trip above"); + menuitem = gtk_menu_item_new_with_label(_("Add to trip above")); g_signal_connect(menuitem, "activate", G_CALLBACK(merge_dive_into_trip_above_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } if (DIVE_IN_TRIP(dive)) { if (dive->selected && amount_selected > 1) - menuitem = gtk_menu_item_new_with_label("Remove selected dives from trip"); + menuitem = gtk_menu_item_new_with_label(_("Remove selected dives from trip")); else - menuitem = gtk_menu_item_new_with_label("Remove dive from trip"); + menuitem = gtk_menu_item_new_with_label(_("Remove dive from trip")); g_signal_connect(menuitem, "activate", G_CALLBACK(remove_from_trip_cb), path); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } } } - menuitem = gtk_menu_item_new_with_label("Expand all"); + menuitem = gtk_menu_item_new_with_label(_("Expand all")); g_signal_connect(menuitem, "activate", G_CALLBACK(expand_all_cb), tree_view); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - menuitem = gtk_menu_item_new_with_label("Collapse all"); + menuitem = gtk_menu_item_new_with_label(_("Collapse all")); g_signal_connect(menuitem, "activate", G_CALLBACK(collapse_all_cb), tree_view); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show_all(menu); diff --git a/equipment.c b/equipment.c index e30f40d1e..1a6de41d7 100644 --- a/equipment.c +++ b/equipment.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "dive.h" #include "display.h" @@ -540,7 +541,7 @@ static void set_one_weightsystem(void *_data, GtkListStore *model, GtkTreeIter * weightsystem_t *ws = _data; gtk_list_store_set(model, iter, - WS_DESC, ws->description ? : "unspecified", + WS_DESC, ws->description ? : _("unspecified"), WS_WEIGHT, ws->weight.grams, -1); } @@ -818,11 +819,11 @@ static struct ws_info { const char *name; int grams; } ws_info[100] = { - { "integrated", 0 }, - { "belt", 0 }, - { "ankle", 0 }, - { "bar", 0 }, - { "clip-on", 0 }, + { N_("integrated"), 0 }, + { N_("belt"), 0 }, + { N_("ankle"), 0 }, + { N_("bar"), 0 }, + { N_("clip-on"), 0 }, }; static void fill_ws_list(GtkListStore *store) @@ -833,7 +834,7 @@ static void fill_ws_list(GtkListStore *store) while (info->name) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, - 0, info->name, + 0, _(info->name), 1, info->grams, -1); info++; @@ -922,7 +923,7 @@ static void cylinder_widget(GtkWidget *vbox, struct cylinder_widget *cylinder, G * Cylinder type: description, size and * working pressure */ - frame = gtk_frame_new("Cylinder"); + frame = gtk_frame_new(_("Cylinder")); hbox = gtk_hbox_new(FALSE, 3); gtk_container_add(GTK_CONTAINER(frame), hbox); @@ -956,12 +957,12 @@ static void cylinder_widget(GtkWidget *vbox, struct cylinder_widget *cylinder, G /* * Cylinder start/end pressures */ - hbox = frame_box("Pressure", vbox); + hbox = frame_box(_("Pressure"), vbox); - widget = labeled_spinbutton(hbox, "Start", 0, 5000, 1); + widget = labeled_spinbutton(hbox, _("Start"), 0, 5000, 1); cylinder->start = widget; - widget = labeled_spinbutton(hbox, "End", 0, 5000, 1); + widget = labeled_spinbutton(hbox, _("End"), 0, 5000, 1); cylinder->end = widget; cylinder->pressure_button = gtk_check_button_new(); @@ -971,7 +972,7 @@ static void cylinder_widget(GtkWidget *vbox, struct cylinder_widget *cylinder, G /* * Cylinder gas mix: Air, Nitrox or Trimix */ - hbox = frame_box("Gasmix", vbox); + hbox = frame_box(_("Gasmix"), vbox); widget = labeled_spinbutton(hbox, "O"UTF8_SUBSCRIPT_2 "%", 1, 100, 0.1); cylinder->o2 = widget; @@ -1008,7 +1009,7 @@ static void ws_widget(GtkWidget *vbox, struct ws_widget *ws_widget, GtkListStore /* * weight_system: description and weight */ - frame = gtk_frame_new("Weight"); + frame = gtk_frame_new(_("Weight")); hbox = gtk_hbox_new(FALSE, 3); gtk_container_add(GTK_CONTAINER(frame), hbox); @@ -1058,7 +1059,7 @@ static int edit_cylinder_dialog(GtkWidget *w, int index, cylinder_t *cyl, int w_ return 0; *cyl = dive->cylinder[index]; - dialog = gtk_dialog_new_with_buttons("Cylinder", + dialog = gtk_dialog_new_with_buttons(_("Cylinder"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -1113,7 +1114,7 @@ static int edit_weightsystem_dialog(GtkWidget *w, int index, weightsystem_t *ws, return 0; *ws = dive->weightsystem[index]; - dialog = gtk_dialog_new_with_buttons("Weight System", + dialog = gtk_dialog_new_with_buttons(_("Weight System"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -1374,7 +1375,7 @@ static void size_data_func(GtkTreeViewColumn *col, if (size) snprintf(buffer, sizeof(buffer), "%.1f", size); else - strcpy(buffer, "unkn"); + strcpy(buffer, _("unkn")); g_object_set(renderer, "text", buffer, NULL); } @@ -1394,7 +1395,7 @@ static void weight_data_func(GtkTreeViewColumn *col, if (grams) snprintf(buffer, sizeof(buffer), "%.*f", decimals, value); else - strcpy(buffer, "unkn"); + strcpy(buffer, _("unkn")); g_object_set(renderer, "text", buffer, NULL); } @@ -1481,11 +1482,11 @@ GtkWidget *cylinder_list_widget(int w_idx) "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL); - tree_view_column(tree_view, CYL_DESC, "Type", NULL, ALIGN_LEFT | UNSORTABLE); - tree_view_column(tree_view, CYL_SIZE, "Size", size_data_func, ALIGN_RIGHT | UNSORTABLE); - tree_view_column(tree_view, CYL_WORKP, "MaxPress", pressure_data_func, ALIGN_RIGHT | UNSORTABLE); - tree_view_column(tree_view, CYL_STARTP, "Start", pressure_data_func, ALIGN_RIGHT | UNSORTABLE); - tree_view_column(tree_view, CYL_ENDP, "End", pressure_data_func, ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, CYL_DESC, _("Type"), NULL, ALIGN_LEFT | UNSORTABLE); + tree_view_column(tree_view, CYL_SIZE, _("Size"), size_data_func, ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, CYL_WORKP, _("MaxPress"), pressure_data_func, ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, CYL_STARTP, _("Start"), pressure_data_func, ALIGN_RIGHT | UNSORTABLE); + tree_view_column(tree_view, CYL_ENDP, _("End"), pressure_data_func, ALIGN_RIGHT | UNSORTABLE); tree_view_column(tree_view, CYL_O2, "O" UTF8_SUBSCRIPT_2 "%", percentage_data_func, ALIGN_RIGHT | UNSORTABLE); tree_view_column(tree_view, CYL_HE, "He%", percentage_data_func, ALIGN_RIGHT | UNSORTABLE); return tree_view; @@ -1509,8 +1510,8 @@ GtkWidget *weightsystem_list_widget(int w_idx) "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL); - tree_view_column(tree_view, WS_DESC, "Type", NULL, ALIGN_LEFT | UNSORTABLE); - tree_view_column(tree_view, WS_WEIGHT, "weight", + tree_view_column(tree_view, WS_DESC, _("Type"), NULL, ALIGN_LEFT | UNSORTABLE); + tree_view_column(tree_view, WS_WEIGHT, _("weight"), weight_data_func, ALIGN_RIGHT | UNSORTABLE); return tree_view; @@ -1568,7 +1569,7 @@ GtkWidget *equipment_widget(int w_idx) hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); - frame = gtk_frame_new("Cylinders"); + frame = gtk_frame_new(_("Cylinders")); gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, FALSE, 3); framebox = gtk_vbox_new(FALSE, 3); @@ -1605,7 +1606,7 @@ GtkWidget *equipment_widget(int w_idx) tree_view = weightsystem_list_create(w_idx); weightsystem_list[w_idx].tree_view = GTK_TREE_VIEW(tree_view); - frame = gtk_frame_new("Weight"); + frame = gtk_frame_new(_("Weight")); gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, FALSE, 3); framebox = gtk_vbox_new(FALSE, 3); diff --git a/file.c b/file.c index 1e58a4afd..93abb8b9e 100644 --- a/file.c +++ b/file.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "dive.h" #include "file.h" @@ -71,7 +72,7 @@ static void suunto_read(struct zip_file *file, GError **error) size = read * 3 / 2; mem = realloc(mem, size); } - parse_xml_buffer("SDE file", mem, read, error, FALSE); + parse_xml_buffer(_("SDE file"), mem, read, error, FALSE); free(mem); } #endif @@ -258,11 +259,11 @@ void parse_file(const char *filename, GError **error, gboolean possible_default_ if (default_filename && ! strcmp(filename, default_filename)) return; - g_warning("Failed to read '%s'.\n", filename); + g_warning(_("Failed to read '%s'.\n"), filename); if (error) { *error = g_error_new(g_quark_from_string("subsurface"), DIVE_ERROR_PARSE, - "Failed to read '%s'", + _("Failed to read '%s'"), filename); } return; diff --git a/gtk-gui.c b/gtk-gui.c index e5ac16f94..79e7d35b8 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -3,6 +3,8 @@ /* creates the window and overall layout * divelist, dive info, equipment and printing are handled in their own source files */ +#include +#include #include #include #include @@ -135,7 +137,7 @@ void report_error(GError* error) { error_count++; char buffer[256]; - snprintf(buffer, sizeof(buffer), "Failed to open %i files.", error_count); + snprintf(buffer, sizeof(buffer), _("Failed to open %i files."), error_count); gtk_label_set(GTK_LABEL(error_label), buffer); } } @@ -148,7 +150,7 @@ static GtkFileFilter *setup_filter(void) gtk_file_filter_add_pattern(filter, "*.sda"); gtk_file_filter_add_pattern(filter, "*.SDA"); gtk_file_filter_add_mime_type(filter, "text/xml"); - gtk_file_filter_set_name(filter, "XML file"); + gtk_file_filter_set_name(filter, _("XML file")); return filter; } @@ -160,7 +162,7 @@ static void file_save_as(GtkWidget *w, gpointer data) char *current_file; char *current_dir; - dialog = gtk_file_chooser_dialog_new("Save File As", + dialog = gtk_file_chooser_dialog_new(_("Save File As"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, @@ -223,7 +225,7 @@ static gboolean ask_save_changes() { GtkWidget *dialog, *label, *content; gboolean quit = TRUE; - dialog = gtk_dialog_new_with_buttons("Save Changes?", + dialog = gtk_dialog_new_with_buttons(_("Save Changes?"), GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_NO, GTK_RESPONSE_NO, @@ -233,11 +235,11 @@ static gboolean ask_save_changes() if (!existing_filename){ label = gtk_label_new ( - "You have unsaved changes\nWould you like to save those before closing the datafile?"); + _("You have unsaved changes\nWould you like to save those before closing the datafile?")); } else { char *label_text = (char*) malloc(sizeof(char) * (94 + strlen(existing_filename))); sprintf(label_text, - "You have unsaved changes to file: %s \nWould you like to save those before closing the datafile?", + _("You have unsaved changes to file: %s \nWould you like to save those before closing the datafile?"), existing_filename); label = gtk_label_new (label_text); free(label_text); @@ -308,7 +310,7 @@ static void file_open(GtkWidget *w, gpointer data) GtkFileFilter *filter; const char *current_default; - dialog = gtk_file_chooser_dialog_new("Open File", + dialog = gtk_file_chooser_dialog_new(_("Open File"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, @@ -515,7 +517,7 @@ static void pick_default_file(GtkWidget *w, GtkButton *button) GtkFileFilter *filter; struct stat sb; - fs_dialog = gtk_file_chooser_dialog_new("Choose Default XML File", + fs_dialog = gtk_file_chooser_dialog_new(_("Choose Default XML File"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, @@ -565,57 +567,57 @@ static void preferences_dialog(GtkWidget *w, gpointer data) menu_units = output_units; - dialog = gtk_dialog_new_with_buttons("Preferences", + dialog = gtk_dialog_new_with_buttons(_("Preferences"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); - frame = gtk_frame_new("Units"); + frame = gtk_frame_new(_("Units")); vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); box = gtk_vbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(frame), box); - create_radio(box, "Depth:", - "Meter", set_meter, (output_units.length == METERS), - "Feet", set_feet, (output_units.length == FEET), + create_radio(box, _("Depth:"), + _("Meter"), set_meter, (output_units.length == METERS), + _("Feet"), set_feet, (output_units.length == FEET), NULL); - create_radio(box, "Pressure:", - "Bar", set_bar, (output_units.pressure == BAR), - "PSI", set_psi, (output_units.pressure == PSI), + create_radio(box, _("Pressure:"), + _("Bar"), set_bar, (output_units.pressure == BAR), + _("PSI"), set_psi, (output_units.pressure == PSI), NULL); - create_radio(box, "Volume:", - "Liter", set_liter, (output_units.volume == LITER), - "CuFt", set_cuft, (output_units.volume == CUFT), + create_radio(box, _("Volume:"), + _("Liter"), set_liter, (output_units.volume == LITER), + _("CuFt"), set_cuft, (output_units.volume == CUFT), NULL); - create_radio(box, "Temperature:", - "Celsius", set_celsius, (output_units.temperature == CELSIUS), - "Fahrenheit", set_fahrenheit, (output_units.temperature == FAHRENHEIT), + create_radio(box, _("Temperature:"), + _("Celsius"), set_celsius, (output_units.temperature == CELSIUS), + _("Fahrenheit"), set_fahrenheit, (output_units.temperature == FAHRENHEIT), NULL); - create_radio(box, "Weight:", - "kg", set_kg, (output_units.weight == KG), - "lbs", set_lbs, (output_units.weight == LBS), + create_radio(box, _("Weight:"), + _("kg"), set_kg, (output_units.weight == KG), + _("lbs"), set_lbs, (output_units.weight == LBS), NULL); - frame = gtk_frame_new("Show Columns"); + frame = gtk_frame_new(_("Show Columns")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); box = gtk_hbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(frame), box); - button = gtk_check_button_new_with_label("Temp"); + button = gtk_check_button_new_with_label(_("Temp")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.temperature); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(temperature_toggle), NULL); - button = gtk_check_button_new_with_label("Cyl"); + button = gtk_check_button_new_with_label(_("Cyl")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.cylinder); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(cylinder_toggle), NULL); @@ -625,44 +627,44 @@ static void preferences_dialog(GtkWidget *w, gpointer data) gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nitrox_toggle), NULL); - button = gtk_check_button_new_with_label("SAC"); + button = gtk_check_button_new_with_label(_("SAC")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.sac); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(sac_toggle), NULL); - button = gtk_check_button_new_with_label("OTU"); + button = gtk_check_button_new_with_label(_("OTU")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.otu); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(otu_toggle), NULL); - button = gtk_check_button_new_with_label("Weight"); + button = gtk_check_button_new_with_label(_("Weight")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.totalweight); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(totalweight_toggle), NULL); - button = gtk_check_button_new_with_label("Suit"); + button = gtk_check_button_new_with_label(_("Suit")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.suit); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(suit_toggle), NULL); - frame = gtk_frame_new("Divelist Font"); + frame = gtk_frame_new(_("Divelist Font")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); font = gtk_font_button_new_with_font(divelist_font); gtk_container_add(GTK_CONTAINER(frame),font); - frame = gtk_frame_new("Misc. Options"); + frame = gtk_frame_new(_("Misc. Options")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); box = gtk_hbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(frame), box); - button = gtk_check_button_new_with_label("Automatically group dives in trips"); + button = gtk_check_button_new_with_label(_("Automatically group dives in trips")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), autogroup); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(autogroup_toggle), NULL); - frame = gtk_frame_new("Default XML Data File"); + frame = gtk_frame_new(_("Default XML Data File")); gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 5); box = gtk_hbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(frame), box); @@ -757,7 +759,7 @@ static void selectevents_dialog(GtkWidget *w, gpointer data) int result; GtkWidget *dialog, *frame, *vbox, *table; - dialog = gtk_dialog_new_with_buttons("SelectEvents", + dialog = gtk_dialog_new_with_buttons(_("SelectEvents"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -766,7 +768,7 @@ static void selectevents_dialog(GtkWidget *w, gpointer data) /* initialize the function that fills the table */ create_toggle(NULL, NULL, NULL); - frame = gtk_frame_new("Enable / Disable Events"); + frame = gtk_frame_new(_("Enable / Disable Events")); vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); @@ -797,7 +799,7 @@ static void renumber_dialog(GtkWidget *w, gpointer data) struct dive *dive; GtkWidget *dialog, *frame, *button, *vbox; - dialog = gtk_dialog_new_with_buttons("Renumber", + dialog = gtk_dialog_new_with_buttons(_("Renumber"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -806,7 +808,7 @@ static void renumber_dialog(GtkWidget *w, gpointer data) vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - frame = gtk_frame_new("New starting number"); + frame = gtk_frame_new(_("New starting number")); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); button = gtk_spin_button_new_with_range(1, 50000, 1); @@ -846,10 +848,10 @@ static void about_dialog(GtkWidget *w, gpointer data) gtk_show_about_dialog(NULL, "program-name", "Subsurface", - "comments", "Multi-platform divelog software in C", + "comments", _("Multi-platform divelog software in C"), "license", "GPLv2", "version", VERSION_STRING, - "copyright", "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012", + "copyright", _("Linus Torvalds, Dirk Hohndel, and others, 2011, 2012"), "logo-icon-name", "subsurface", /* Must be last: */ logo_property, logo, @@ -894,36 +896,36 @@ static void toggle_zoom(GtkWidget *w, gpointer data) } static GtkActionEntry menu_items[] = { - { "FileMenuAction", NULL, "File", NULL, NULL, NULL}, - { "LogMenuAction", NULL, "Log", NULL, NULL, NULL}, - { "ViewMenuAction", NULL, "View", NULL, NULL, NULL}, - { "FilterMenuAction", NULL, "Filter", NULL, NULL, NULL}, - { "HelpMenuAction", NULL, "Help", NULL, NULL, NULL}, + { "FileMenuAction", NULL, N_("File"), NULL, NULL, NULL}, + { "LogMenuAction", NULL, N_("Log"), NULL, NULL, NULL}, + { "ViewMenuAction", NULL, N_("View"), NULL, NULL, NULL}, + { "FilterMenuAction", NULL, N_("Filter"), NULL, NULL, NULL}, + { "HelpMenuAction", NULL, N_("Help"), NULL, NULL, NULL}, { "NewFile", GTK_STOCK_NEW, NULL, CTRLCHAR "N", NULL, G_CALLBACK(file_close) }, { "OpenFile", GTK_STOCK_OPEN, NULL, CTRLCHAR "O", NULL, G_CALLBACK(file_open) }, { "SaveFile", GTK_STOCK_SAVE, NULL, CTRLCHAR "S", NULL, G_CALLBACK(file_save) }, { "SaveAsFile", GTK_STOCK_SAVE_AS, NULL, SHIFTCHAR CTRLCHAR "S", NULL, G_CALLBACK(file_save_as) }, { "CloseFile", GTK_STOCK_CLOSE, NULL, NULL, NULL, G_CALLBACK(file_close) }, { "Print", GTK_STOCK_PRINT, NULL, CTRLCHAR "P", NULL, G_CALLBACK(do_print) }, - { "ImportFile", GTK_STOCK_GO_BACK, "Import XML File(s)", CTRLCHAR "I", NULL, G_CALLBACK(import_files) }, - { "DownloadLog", GTK_STOCK_GO_DOWN, "Download From Dive Computer", CTRLCHAR "D", NULL, G_CALLBACK(download_dialog) }, - { "AddDive", GTK_STOCK_ADD, "Add Dive", NULL, NULL, G_CALLBACK(add_dive_cb) }, - { "Preferences", GTK_STOCK_PREFERENCES, "Preferences", PREFERENCE_ACCEL, NULL, G_CALLBACK(preferences_dialog) }, - { "Renumber", NULL, "Renumber", NULL, NULL, G_CALLBACK(renumber_dialog) }, - { "YearlyStats", NULL, "Yearly Statistics", NULL, NULL, G_CALLBACK(show_yearly_stats) }, - { "SelectEvents", NULL, "SelectEvents", NULL, NULL, G_CALLBACK(selectevents_dialog) }, + { "ImportFile", GTK_STOCK_GO_BACK, N_("Import XML File(s)"), CTRLCHAR "I", NULL, G_CALLBACK(import_files) }, + { "DownloadLog", GTK_STOCK_GO_DOWN, N_("Download From Dive Computer"), CTRLCHAR "D", NULL, G_CALLBACK(download_dialog) }, + { "AddDive", GTK_STOCK_ADD, N_("Add Dive"), NULL, NULL, G_CALLBACK(add_dive_cb) }, + { "Preferences", GTK_STOCK_PREFERENCES, N_("Preferences"), PREFERENCE_ACCEL, NULL, G_CALLBACK(preferences_dialog) }, + { "Renumber", NULL, N_("Renumber"), NULL, NULL, G_CALLBACK(renumber_dialog) }, + { "YearlyStats", NULL, N_("Yearly Statistics"), NULL, NULL, G_CALLBACK(show_yearly_stats) }, + { "SelectEvents", NULL, N_("SelectEvents"), NULL, NULL, G_CALLBACK(selectevents_dialog) }, { "Quit", GTK_STOCK_QUIT, NULL, CTRLCHAR "Q", NULL, G_CALLBACK(quit) }, { "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(about_dialog) }, - { "ViewList", NULL, "List", CTRLCHAR "1", NULL, G_CALLBACK(view_list) }, - { "ViewProfile", NULL, "Profile", CTRLCHAR "2", NULL, G_CALLBACK(view_profile) }, - { "ViewInfo", NULL, "Info", CTRLCHAR "3", NULL, G_CALLBACK(view_info) }, - { "ViewThree", NULL, "Three", CTRLCHAR "4", NULL, G_CALLBACK(view_three) }, + { "ViewList", NULL, N_("List"), CTRLCHAR "1", NULL, G_CALLBACK(view_list) }, + { "ViewProfile", NULL, N_("Profile"), CTRLCHAR "2", NULL, G_CALLBACK(view_profile) }, + { "ViewInfo", NULL, N_("Info"), CTRLCHAR "3", NULL, G_CALLBACK(view_info) }, + { "ViewThree", NULL, N_("Three"), CTRLCHAR "4", NULL, G_CALLBACK(view_three) }, }; static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); static GtkToggleActionEntry toggle_items[] = { - { "Autogroup", NULL, "Autogroup", NULL, NULL, G_CALLBACK(autogroup_cb), FALSE }, - { "ToggleZoom", NULL, "Toggle Zoom", CTRLCHAR "0", NULL, G_CALLBACK(toggle_zoom), FALSE }, + { "Autogroup", NULL, N_("Autogroup"), NULL, NULL, G_CALLBACK(autogroup_cb), FALSE }, + { "ToggleZoom", NULL, N_("Toggle Zoom"), CTRLCHAR "0", NULL, G_CALLBACK(toggle_zoom), FALSE }, }; static gint ntoggle_items = sizeof (toggle_items) / sizeof (toggle_items[0]); @@ -974,6 +976,7 @@ static const gchar* ui_string = " \ static GtkWidget *get_menubar_menu(GtkWidget *window, GtkUIManager *ui_manager) { GtkActionGroup *action_group = gtk_action_group_new("Menu"); + gtk_action_group_set_translation_domain(action_group, "subsurface"); gtk_action_group_add_actions(action_group, menu_items, nmenu_items, 0); toggle_items[0].is_active = autogroup; gtk_action_group_add_toggle_actions(action_group, toggle_items, ntoggle_items, 0); @@ -1106,19 +1109,19 @@ void init_ui(int *argcp, char ***argvp) /* Frame for extended dive info */ nb_page = extended_dive_info_widget(); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Dive Notes")); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new(_("Dive Notes"))); /* Frame for dive equipment */ nb_page = equipment_widget(W_IDX_PRIMARY); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Equipment")); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new(_("Equipment"))); /* Frame for single dive statistics */ nb_page = single_stats_widget(); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Dive Info")); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new(_("Dive Info"))); /* Frame for total dive statistics */ nb_page = total_stats_widget(); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Stats")); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new(_("Stats"))); gtk_widget_set_app_paintable(win, TRUE); gtk_widget_show_all(win); @@ -1327,7 +1330,7 @@ static GtkComboBox *dive_computer_selector(GtkWidget *vbox) model = gtk_list_store_new(1, G_TYPE_POINTER); default_index = fill_computer_list(model); - frame = gtk_frame_new("Dive computer"); + frame = gtk_frame_new(_("Dive computer")); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 3); combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); @@ -1358,7 +1361,7 @@ static GtkEntry *dive_computer_device(GtkWidget *vbox) hbox = gtk_hbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); - frame = gtk_frame_new("Device name"); + frame = gtk_frame_new(_("Device name")); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 3); entry = gtk_entry_new(); @@ -1390,7 +1393,7 @@ void import_files(GtkWidget *w, gpointer data) struct stat sb; GSList *filenames = NULL; - fs_dialog = gtk_file_chooser_dialog_new("Choose XML Files To Import Into Current Data File", + fs_dialog = gtk_file_chooser_dialog_new(_("Choose XML Files To Import Into Current Data File"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, @@ -1465,7 +1468,7 @@ static GtkWidget *import_dive_computer(device_data_t *data, GtkDialog *dialog) button = gtk_dialog_get_widget_for_response(dialog, GTK_RESPONSE_ACCEPT); gtk_button_set_use_stock(GTK_BUTTON(button), 0); - gtk_button_set_label(GTK_BUTTON(button), "Retry"); + gtk_button_set_label(GTK_BUTTON(button), _("Retry")); vbox = gtk_dialog_get_content_area(dialog); @@ -1488,7 +1491,7 @@ void download_dialog(GtkWidget *w, gpointer data) .devname = NULL, }; - dialog = gtk_dialog_new_with_buttons("Download From Dive Computer", + dialog = gtk_dialog_new_with_buttons(_("Download From Dive Computer"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -1496,7 +1499,7 @@ void download_dialog(GtkWidget *w, gpointer data) NULL); vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - label = gtk_label_new(" Please select dive computer and device. "); + label = gtk_label_new(_(" Please select dive computer and device. ")); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 3); computer = dive_computer_selector(vbox); device = dive_computer_device(vbox); diff --git a/info.c b/info.c index 3dfaa3370..b1e19e6b0 100644 --- a/info.c +++ b/info.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "dive.h" #include "display.h" @@ -102,7 +103,7 @@ static int divename(char *buf, size_t size, struct dive *dive) struct tm tm; utc_mkdate(dive->when, &tm); - return snprintf(buf, size, "Dive #%d - %s %02d/%02d/%04d at %d:%02d", + return snprintf(buf, size, _("Dive #%d - %s %02d/%02d/%04d at %d:%02d"), dive->number, weekday(tm.tm_wday), tm.tm_mon+1, tm.tm_mday, @@ -140,7 +141,7 @@ void show_dive_info(struct dive *dive) if (!text) text = ""; if (*text) { - snprintf(buffer, sizeof(buffer), "Dive #%d - %s", dive->number, text); + snprintf(buffer, sizeof(buffer), _("Dive #%d - %s"), dive->number, text); } else { divename(buffer, sizeof(buffer), dive); } @@ -174,7 +175,7 @@ static int delete_dive_info(struct dive *dive) if (!dive) return 0; - dialog = gtk_dialog_new_with_buttons("Delete Dive", + dialog = gtk_dialog_new_with_buttons(_("Delete Dive"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -223,8 +224,8 @@ static void add_menu_item(GtkMenu *menu, const char *label, const char *icon, vo static void populate_popup_cb(GtkTextView *entry, GtkMenu *menu, gpointer user_data) { - add_menu_item(menu, "Delete", GTK_STOCK_DELETE, info_menu_delete_cb); - add_menu_item(menu, "Edit", GTK_STOCK_EDIT, info_menu_edit_cb); + add_menu_item(menu, _("Delete"), GTK_STOCK_DELETE, info_menu_delete_cb); + add_menu_item(menu, _("Edit"), GTK_STOCK_EDIT, info_menu_edit_cb); } static GtkEntry *text_value(GtkWidget *box, const char *label) @@ -449,17 +450,17 @@ static void save_dive_info_changes(struct dive *dive, struct dive *master, struc static void dive_trip_widget(GtkWidget *box, dive_trip_t *trip, struct dive_info *info) { GtkWidget *hbox, *label; - char buffer[80] = "Edit trip summary"; + char buffer[80] = N_("Edit trip summary"); - label = gtk_label_new(buffer); + label = gtk_label_new(_(buffer)); gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0); - info->location = text_entry(box, "Location", location_list, trip->location); + info->location = text_entry(box, _("Location"), location_list, trip->location); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0); - info->notes = text_view(box, "Notes", READ_WRITE); + info->notes = text_view(box, _("Notes"), READ_WRITE); if (trip->notes && *trip->notes) gtk_text_buffer_set_text(gtk_text_view_get_buffer(info->notes), trip->notes, -1); } @@ -467,32 +468,32 @@ static void dive_trip_widget(GtkWidget *box, dive_trip_t *trip, struct dive_info static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info *info, gboolean multi) { GtkWidget *hbox, *label, *frame, *equipment; - char buffer[80] = "Edit multiple dives"; + char buffer[80] = N_("Edit multiple dives"); if (!multi) - divename(buffer, sizeof(buffer), dive); - label = gtk_label_new(buffer); + divename(_(buffer), sizeof(_(buffer)), dive); + label = gtk_label_new(_(buffer)); gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0); - info->location = text_entry(box, "Location", location_list, dive->location); + info->location = text_entry(box, _("Location"), location_list, dive->location); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0); - info->divemaster = text_entry(hbox, "Dive master", people_list, dive->divemaster); - info->buddy = text_entry(hbox, "Buddy", people_list, dive->buddy); + info->divemaster = text_entry(hbox, _("Dive master"), people_list, dive->divemaster); + info->buddy = text_entry(hbox, _("Buddy"), people_list, dive->buddy); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0); - info->rating = text_entry(hbox, "Rating", star_list, star_strings[dive->rating]); - info->suit = text_entry(hbox, "Suit", suit_list, dive->suit); + info->rating = text_entry(hbox, _("Rating"), star_list, star_strings[dive->rating]); + info->suit = text_entry(hbox, _("Suit"), suit_list, dive->suit); /* only show notes if editing a single dive */ if (multi) { info->notes = NULL; } else { - info->notes = text_view(box, "Notes", READ_WRITE); + info->notes = text_view(box, _("Notes"), READ_WRITE); if (dive->notes && *dive->notes) gtk_text_buffer_set_text(gtk_text_view_get_buffer(info->notes), dive->notes, -1); } @@ -500,7 +501,7 @@ static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0); /* create a secondary Equipment widget */ - frame = gtk_frame_new("Equipment"); + frame = gtk_frame_new(_("Equipment")); equipment = equipment_widget(W_IDX_SECONDARY); gtk_container_add(GTK_CONTAINER(frame), equipment); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 0); @@ -624,7 +625,7 @@ gboolean edit_trip(dive_trip_t *trip) struct dive_info info; memset(&info, 0, sizeof(struct dive_info)); - dialog = gtk_dialog_new_with_buttons("Edit Trip Info", + dialog = gtk_dialog_new_with_buttons(_("Edit Trip Info"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -665,7 +666,7 @@ int edit_multi_dive_info(struct dive *single_dive) struct dive *master; gboolean multi; - dialog = gtk_dialog_new_with_buttons("Dive Info", + dialog = gtk_dialog_new_with_buttons(_("Dive Info"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -772,7 +773,7 @@ static timestamp_t dive_time_widget(struct dive *dive) int success; double depthinterval, val; - dialog = gtk_dialog_new_with_buttons("Date and Time", + dialog = gtk_dialog_new_with_buttons(_("Date and Time"), GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -782,12 +783,12 @@ static timestamp_t dive_time_widget(struct dive *dive) vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); /* Calendar hbox */ - hbox = frame_box(vbox, "Date:"); + hbox = frame_box(vbox, _("Date:")); cal = gtk_calendar_new(); gtk_box_pack_start(GTK_BOX(hbox), cal, FALSE, TRUE, 0); /* Time hbox */ - hbox = frame_box(vbox, "Time"); + hbox = frame_box(vbox, _("Time")); h = gtk_spin_button_new_with_range (0.0, 23.0, 1.0); m = gtk_spin_button_new_with_range (0.0, 59.0, 1.0); @@ -827,12 +828,12 @@ static timestamp_t dive_time_widget(struct dive *dive) gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* Duration hbox */ - box = frame_box(hbox, "Duration (min)"); + box = frame_box(hbox, _("Duration (min)")); duration = gtk_spin_button_new_with_range (0.0, 1000.0, 1.0); gtk_box_pack_end(GTK_BOX(box), duration, FALSE, FALSE, 0); /* Depth box */ - box = frame_box(hbox, "Depth (%s):", output_units.length == FEET ? "ft" : "m"); + box = frame_box(hbox, _("Depth (%s):"), output_units.length == FEET ? "ft" : "m"); if (output_units.length == FEET) { depthinterval = 1.0; } else { @@ -901,20 +902,20 @@ GtkWidget *extended_dive_info_widget(void) suit_list = gtk_list_store_new(1, G_TYPE_STRING); gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); - location = text_value(vbox, "Location"); + location = text_value(vbox, _("Location")); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - divemaster = text_value(hbox, "Divemaster"); - buddy = text_value(hbox, "Buddy"); + divemaster = text_value(hbox, _("Divemaster")); + buddy = text_value(hbox, _("Buddy")); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - rating = text_value(hbox, "Rating"); - suit = text_value(hbox, "Suit"); + rating = text_value(hbox, _("Rating")); + suit = text_value(hbox, _("Suit")); - notes = text_view(vbox, "Notes", READ_ONLY); + notes = text_view(vbox, _("Notes"), READ_ONLY); return vbox; } diff --git a/libdivecomputer.c b/libdivecomputer.c index c9683fbb9..51d0a8c1d 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "dive.h" #include "divelist.h" diff --git a/main.c b/main.c index aa418e637..1ca484d0c 100644 --- a/main.c +++ b/main.c @@ -1,8 +1,11 @@ /* main.c */ +#include #include #include #include #include +#include +#include #include "dive.h" #include "divelist.h" @@ -29,17 +32,19 @@ static int sortfn(const void *_a, const void *_b) const char *weekday(int wday) { - static const char wday_array[7][4] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + static const char wday_array[7][7] = { + /*++GETTEXT: these are three letter days - we allow up to six code bytes */ + N_("Sun"), N_("Mon"), N_("Tue"), N_("Wed"), N_("Thu"), N_("Fri"), N_("Sat") }; return wday_array[wday]; } const char *monthname(int mon) { - static const char month_array[12][4] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + static const char month_array[12][7] = { + /*++GETTEXT: these are three letter months - we allow up to six code bytes*/ + N_("Jan"), N_("Feb"), N_("Mar"), N_("Apr"), N_("May"), N_("Jun"), + N_("Jul"), N_("Aug"), N_("Sep"), N_("Oct"), N_("Nov"), N_("Dec"), }; return month_array[mon]; } @@ -221,6 +226,13 @@ int main(int argc, char **argv) int i; gboolean no_filenames = TRUE; + /* set up l18n - the search directory needs to change + * so that it uses the correct system directory when + * subsurface isn't run from the local directory */ + setlocale( LC_ALL, "" ); + bindtextdomain("subsurface", "./locale"); + bind_textdomain_codeset("subsurface", "utf-8"); + textdomain("subsurface"); output_units = SI_units; subsurface_command_line_init(&argc, &argv); diff --git a/parse-xml.c b/parse-xml.c index 698fe2a2f..d6197b57d 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -11,6 +11,7 @@ #ifdef XSLT #include #endif +#include #include "dive.h" #include "uemis.h" @@ -1462,12 +1463,12 @@ void parse_xml_buffer(const char *url, const char *buffer, int size, GError **er doc = xmlReadMemory(buffer, size, url, NULL, 0); if (!doc) { - fprintf(stderr, "Failed to parse '%s'.\n", url); + fprintf(stderr, _("Failed to parse '%s'.\n"), url); if (error != NULL) { *error = g_error_new(g_quark_from_string("subsurface"), DIVE_ERROR_PARSE, - "Failed to parse '%s'", + _("Failed to parse '%s'"), url); } return; diff --git a/po/deutsch.po b/po/deutsch.po new file mode 100644 index 000000000..464b26792 --- /dev/null +++ b/po/deutsch.po @@ -0,0 +1,971 @@ +# German translations for PACKAGE package +# German messages for PACKAGE. +# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Dirk Hohndel , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: 2.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-10-11 07:42+0900\n" +"PO-Revision-Date: 2012-10-10 16:27+0900\n" +"Last-Translator: Dirk Hohndel \n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: statistics.c:160 +msgid "" +"\n" +"Average" +msgstr "" +"\n" +"Durchschnitt" + +#: statistics.c:161 +msgid "" +"\n" +"Longest" +msgstr "" +"\n" +"längster" + +#: statistics.c:162 statistics.c:163 +msgid "" +"\n" +"Maximum" +msgstr "" +"\n" +"Grösste" + +#: statistics.c:161 statistics.c:162 statistics.c:163 +msgid "" +"\n" +"Minimum" +msgstr "" +"\n" +"Kleinste" + +#: statistics.c:161 +msgid "" +"\n" +"Shortest" +msgstr "" +"\n" +"Kürzeste" + +#: gtk-gui.c:1502 +msgid " Please select dive computer and device. " +msgstr " Bitte Tauchcomputer und Gerät auswählen. " + +#: statistics.c:601 statistics.c:603 statistics.c:605 +#, c-format +msgid "%.*f %s/min" +msgstr "%.*f %s/min" + +#: print.c:252 statistics.c:512 +#, c-format +msgid "%d min" +msgstr "%d min" + +#: statistics.c:484 +#, c-format +msgid "%dd %dh %dmin" +msgstr "%dt %dst %dmin" + +#: statistics.c:486 +#, c-format +msgid "%dh %dmin" +msgstr "%dst %dmin" + +#: dive.c:618 +#, c-format +msgid "(%s) or (%s)" +msgstr "(%s) oder (%s)" + +#: gtk-gui.c:912 +msgid "Add Dive" +msgstr "Tauchgang hinzufügen" + +#: divelist.c:2019 +msgid "Add dive" +msgstr "Tauchgang hinzufügen" + +#: divelist.c:2098 +msgid "Add to trip above" +msgstr "Zum obigen Trip hinzufügen" + +#: main.c:47 +msgid "Apr" +msgstr "Apr" + +#: main.c:48 +msgid "Aug" +msgstr "Aug" + +#: gtk-gui.c:927 +msgid "Autogroup" +msgstr "Automatisch gruppieren" + +#: gtk-gui.c:662 +msgid "Automatically group dives in trips" +msgstr "Automatisch die Tauchgänge in Trips gruppieren" + +#: statistics.c:668 statistics.c:705 +msgid "Avg Depth" +msgstr "Durchschn. Tiefe" + +#: statistics.c:676 +msgid "Avg SAC" +msgstr "Durchschn. Gasverbrauch" + +#: statistics.c:651 +msgid "Avg Temp" +msgstr "Durchschn. Temp" + +#: statistics.c:658 +msgid "Avg Time" +msgstr "Duchschn. Dauer" + +#: gtk-gui.c:590 +msgid "Bar" +msgstr "bar" + +#: info.c:484 info.c:911 print.c:155 +msgid "Buddy" +msgstr "Partner" + +#: gtk-gui.c:600 +msgid "Celsius" +msgstr "Celsius" + +#: gtk-gui.c:520 +msgid "Choose Default XML File" +msgstr "Default XML Datei auswählen" + +#: gtk-gui.c:1396 +msgid "Choose XML Files To Import Into Current Data File" +msgstr "" +"Bitte XML Dateien auswählen, die in die aktuelle Datei eingefügt werden " +"sollen" + +#: divelist.c:2115 +msgid "Collapse all" +msgstr "Alle einfalten" + +#: divelist.c:2088 +msgid "Create new trip above" +msgstr "Neuen Trip darüber einfügen" + +#: gtk-gui.c:596 +msgid "CuFt" +msgstr "cuft" + +#: divelist.c:1265 gtk-gui.c:620 +msgid "Cyl" +msgstr "Tank" + +#: equipment.c:926 equipment.c:1062 +msgid "Cylinder" +msgstr "Tank" + +#: equipment.c:1572 +msgid "Cylinders" +msgstr "Tanks" + +#: divelist.c:1258 print.c:154 statistics.c:696 +msgid "Date" +msgstr "Datum" + +#: info.c:776 +msgid "Date and Time" +msgstr "Datum und Zeit" + +#: info.c:786 +msgid "Date:" +msgstr "Datum:" + +#: main.c:48 +msgid "Dec" +msgstr "Dez" + +#: gtk-gui.c:667 +msgid "Default XML Data File" +msgstr "Default XML Datei" + +#: info.c:227 +msgid "Delete" +msgstr "Löschen" + +#: info.c:178 +msgid "Delete Dive" +msgstr "Tauchgang löschen" + +#: divelist.c:2006 +msgid "Delete dive" +msgstr "Tauchgang löschen" + +#: divelist.c:2005 +msgid "Delete dives" +msgstr "Tauchgänge löschen" + +#: print.c:154 +msgid "Depth" +msgstr "Tiefe" + +#: statistics.c:161 +msgid "" +"Depth\n" +"Average" +msgstr "" +"Tiefe\n" +"Durchschnitt" + +#: info.c:836 +#, c-format +msgid "Depth (%s):" +msgstr "Tiefe (%s):" + +#: uemis.c:156 +msgid "Depth Limit Exceeded" +msgstr "Tiefenschwelle überschritten" + +#: gtk-gui.c:584 +msgid "Depth:" +msgstr "Tiefe:" + +#: gtk-gui.c:1364 +msgid "Device name" +msgstr "Geräte Name" + +#: print.c:67 +#, c-format +msgid "Dive #%d - " +msgstr "Tauchgang #%d - " + +#: info.c:144 +#, c-format +msgid "Dive #%d - %s" +msgstr "Tauchgang #%d - %s" + +#: info.c:106 +#, c-format +msgid "Dive #%d - %s %02d/%02d/%04d at %d:%02d" +msgstr "Tauchgang #%d - %s %02d/%02d/%04d um %d:%02d" + +#: gtk-gui.c:1120 info.c:669 statistics.c:687 +msgid "Dive Info" +msgstr "Informationen" + +#: gtk-gui.c:1112 +msgid "Dive Notes" +msgstr "Notizen" + +#: statistics.c:697 +msgid "Dive Time" +msgstr "Startzeit" + +#: uemis.c:162 +msgid "Dive Time Alert" +msgstr "Alarm: Tauchgangdauer" + +#: uemis.c:160 +msgid "Dive Time Info" +msgstr "Info: Tauchgangdauer" + +#: gtk-gui.c:1333 +msgid "Dive computer" +msgstr "Tauchcomputer" + +#: print.c:474 +msgid "Dive details" +msgstr "Notizen zum Tauchgang" + +#: info.c:483 +msgid "Dive master" +msgstr "Dive-Master" + +#: print.c:154 +msgid "Dive#" +msgstr "Tauchgang Nr." + +#: gtk-gui.c:650 +msgid "Divelist Font" +msgstr "Schriftart für Tauchliste" + +#: info.c:910 +msgid "Divemaster" +msgstr "Divemaster" + +#: statistics.c:648 +msgid "Dives" +msgstr "Tauchgänge" + +#: gtk-gui.c:911 gtk-gui.c:1494 +msgid "Download From Dive Computer" +msgstr "Vom Tauchcomputer runterladen" + +#: statistics.c:160 +msgid "" +"Duration\n" +"Total" +msgstr "" +"Dauer\n" +"Total" + +#: info.c:831 +msgid "Duration (min)" +msgstr "Dauer (min)" + +#: info.c:228 +msgid "Edit" +msgstr "Editieren" + +#: info.c:628 +msgid "Edit Trip Info" +msgstr "Trip Informationen editieren" + +#: divelist.c:2027 +msgid "Edit Trip Summary" +msgstr "Trip Übersicht editieren" + +#: divelist.c:2003 +msgid "Edit dive" +msgstr "Tauchgang editieren" + +#: divelist.c:2002 +msgid "Edit dives" +msgstr "Tauchgänge editieren" + +#: info.c:471 +msgid "Edit multiple dives" +msgstr "Mehrere Tauchgänge editieren" + +#: info.c:453 +msgid "Edit trip summary" +msgstr "Trip Übersicht editieren" + +#: gtk-gui.c:771 +msgid "Enable / Disable Events" +msgstr "Ereignisse Ein-/Ausblenden" + +#: equipment.c:965 equipment.c:1489 +msgid "End" +msgstr "Ende" + +#: gtk-gui.c:1116 info.c:504 +msgid "Equipment" +msgstr "Ausrüstung" + +#: divelist.c:2112 +msgid "Expand all" +msgstr "Alle ausfalten" + +#: gtk-gui.c:601 +msgid "Fahrenheit" +msgstr "Fahrenheit" + +#: gtk-gui.c:140 +#, c-format +msgid "Failed to open %i files." +msgstr "Fehler beim Öffnen von %i Dateien" + +#: parse-xml.c:1471 +#, c-format +msgid "Failed to parse '%s'" +msgstr "Fehler beim Analysieren von '%s'" + +#: parse-xml.c:1466 +#, c-format +msgid "Failed to parse '%s'.\n" +msgstr "Fehler beim Analysieren von '%s'.\n" + +#: file.c:266 +#, c-format +msgid "Failed to read '%s'" +msgstr "Fehler beim Lesen von '%s'" + +#: file.c:262 +#, c-format +msgid "Failed to read '%s'.\n" +msgstr "Fehler beim Lesen von '%s'.\n" + +#: main.c:47 +msgid "Feb" +msgstr "Feb" + +#: gtk-gui.c:586 +msgid "Feet" +msgstr "Fuß" + +#: gtk-gui.c:899 +msgid "File" +msgstr "Datei" + +#: gtk-gui.c:902 +msgid "Filter" +msgstr "Filter" + +#: main.c:38 +msgid "Fri" +msgstr "Fr" + +#: statistics.c:715 +msgid "Gas Used" +msgstr "Gasverbrauch" + +#: equipment.c:975 +msgid "Gasmix" +msgstr "Gasmischung" + +#: gtk-gui.c:903 +msgid "Help" +msgstr "Hilfe" + +#: gtk-gui.c:910 +msgid "Import XML File(s)" +msgstr "XML Datei(en) einlesen" + +#: gtk-gui.c:921 +msgid "Info" +msgstr "Informatinen" + +#. ++GETTEXT: these are three character months +#: main.c:47 +msgid "Jan" +msgstr "Jan" + +#: main.c:48 +msgid "Jul" +msgstr "Jul" + +#: main.c:47 +msgid "Jun" +msgstr "Jun" + +#: gtk-gui.c:854 +msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012" +msgstr "Linus Torvalds, Dirk Hohndel und andere, 2011, 2012" + +#: gtk-gui.c:919 +msgid "List" +msgstr "Liste" + +#: gtk-gui.c:595 +msgid "Liter" +msgstr "Liter" + +#: divelist.c:1269 info.c:458 info.c:478 info.c:905 print.c:155 +msgid "Location" +msgstr "Ort" + +#: gtk-gui.c:900 +msgid "Log" +msgstr "Log" + +#: statistics.c:659 +msgid "Longest Dive" +msgstr "Längster Tauchgang" + +#: uemis.c:170 +msgid "Low Battery Alert" +msgstr "Alarm: Batterie schwach" + +#: uemis.c:168 +msgid "Low Battery Warning" +msgstr "Warnung: Batterie schwach" + +#: main.c:47 +msgid "Mar" +msgstr "Mär" + +#: uemis.c:164 +msgid "Marker" +msgstr "Markierung" + +#: print.c:154 +msgid "Master" +msgstr "Master" + +#: uemis.c:158 +msgid "Max Deco Time Warning" +msgstr "Warnung: Maximale Deco Zeit" + +#: statistics.c:666 statistics.c:704 +msgid "Max Depth" +msgstr "Max. Tiefe" + +#: statistics.c:674 +msgid "Max SAC" +msgstr "Max. Gasverbrauch" + +#: statistics.c:649 +msgid "Max Temp" +msgstr "Max. Temp." + +#: print.c:94 +#, c-format +msgid "" +"Max depth: %.*f %s\n" +"Duration: %d min\n" +"%s" +msgstr "" +"Max. Tiefe: %.*f %s\n" +"Dauer: %d min\n" +"%s" + +#: equipment.c:1487 +msgid "MaxPress" +msgstr "Max.Druck" + +#: main.c:47 +msgid "May" +msgstr "Mai" + +#: divelist.c:2035 +msgid "Merge trip with trip above" +msgstr "Trip mit dem darüber verbinden" + +#: divelist.c:2045 +msgid "Merge trip with trip below" +msgstr "Trip mit dem darunter verbinden" + +#: gtk-gui.c:585 +msgid "Meter" +msgstr "Meter" + +#: statistics.c:667 +msgid "Min Depth" +msgstr "Min. Tiefe" + +#: statistics.c:675 +msgid "Min SAC" +msgstr "Min. Gasverbrauch" + +#: statistics.c:650 +msgid "Min Temp" +msgstr "Min. Temp." + +#: gtk-gui.c:656 +msgid "Misc. Options" +msgstr "Verschiedene Optionen" + +#: main.c:38 +msgid "Mon" +msgstr "Mo" + +#: gtk-gui.c:851 +msgid "Multi-platform divelog software in C" +msgstr "Multi-Platform Tauchprogram in C" + +#: gtk-gui.c:811 +msgid "New starting number" +msgstr "Neue erste Nummer" + +#: uemis.c:166 +msgid "No Tank Data" +msgstr "Keine Tank Informationen" + +#: info.c:463 info.c:496 info.c:919 +msgid "Notes" +msgstr "Notizen" + +#: main.c:48 +msgid "Nov" +msgstr "Nov" + +#: divelist.c:1268 gtk-gui.c:635 statistics.c:713 +msgid "OTU" +msgstr "OTU" + +#: main.c:48 +msgid "Oct" +msgstr "Okt" + +#: gtk-gui.c:313 +msgid "Open File" +msgstr "Datei öffnen" + +#: uemis.c:144 +msgid "PO2 Ascend Alarm" +msgstr "Alarm: Aufstieg" + +#: uemis.c:142 +msgid "PO2 Ascend Warning" +msgstr "Warnung: Aufstieg / PO2" + +#: uemis.c:139 +msgid "PO2 Green Warning" +msgstr "Warnung: PO2 Grün" + +#: gtk-gui.c:591 +msgid "PSI" +msgstr "psi" + +#: gtk-gui.c:570 gtk-gui.c:913 +msgid "Preferences" +msgstr "Einstellungen" + +#: equipment.c:960 +msgid "Pressure" +msgstr "Druck" + +#: gtk-gui.c:589 +msgid "Pressure:" +msgstr "Druck:" + +#: print.c:484 +msgid "Pretty print" +msgstr "Schön drucken" + +#: print.c:505 +msgid "Print only selected dives" +msgstr "Nur ausgewählte Tauchgänge drucken" + +#: print.c:500 +msgid "Print selection" +msgstr "Auswahl drucken" + +#: print.c:478 +msgid "Print type" +msgstr "Art des Ausdrucks" + +#: gtk-gui.c:920 +msgid "Profile" +msgstr "Profil" + +#: uemis.c:152 +msgid "RGT Alert" +msgstr "Alarm: verbleibende Gas-Zeit" + +#: uemis.c:150 +msgid "RGT Warning" +msgstr "Warnung: verbleibende Gas-Zeit" + +#: info.c:489 info.c:916 +msgid "Rating" +msgstr "Bewertung" + +#: uemis-downloader.c:267 +#, c-format +msgid "Reading dive %s" +msgstr "Lese Tauchgang %s" + +#: divelist.c:2050 +msgid "Remove Trip" +msgstr "Trip entfernen" + +#: divelist.c:2106 +msgid "Remove dive from trip" +msgstr "Tauchgang vom Trip entfernen" + +#: divelist.c:2104 +msgid "Remove selected dives from trip" +msgstr "Ausgewählte Tauchgänge vom Trip entfernen" + +#: gtk-gui.c:802 gtk-gui.c:914 +msgid "Renumber" +msgstr "Neu nummerieren" + +#: gtk-gui.c:1471 +msgid "Retry" +msgstr "Wiederholen" + +#: divelist.c:1267 gtk-gui.c:630 statistics.c:712 +msgid "SAC" +msgstr "Gasverbrauchsrate" + +#: statistics.c:162 +msgid "" +"SAC\n" +"Average" +msgstr "" +"Gasverbrauchsrate\n" +"Durchschnitt" + +#: file.c:75 +msgid "SDE file" +msgstr "SDE Datei" + +#: uemis.c:132 +msgid "Safety Stop Violation" +msgstr "Verletzung des Sicherheitsstops" + +#: main.c:38 +msgid "Sat" +msgstr "Sa" + +#: gtk-gui.c:228 +msgid "Save Changes?" +msgstr "Änderungen speichern?" + +#: gtk-gui.c:165 +msgid "Save File As" +msgstr "Datei speichern unter" + +#: gtk-gui.c:762 gtk-gui.c:916 +msgid "SelectEvents" +msgstr "Ereignisse auswählen" + +#: main.c:48 +msgid "Sep" +msgstr "Sep" + +#: uemis-downloader.c:30 +msgid "" +"Short write to req.txt file\n" +"Is the Uemis Zurich plugged in correctly?" +msgstr "" +"Partieller Schreibvorgang der req.txt Datei\n" +"Ist der Uemis Zurich korrekt verbunden?" + +#: statistics.c:660 +msgid "Shortest Dive" +msgstr "Kürzester Tauchgang" + +#: gtk-gui.c:609 +msgid "Show Columns" +msgstr "Spalten anzeigen" + +#: equipment.c:1486 +msgid "Size" +msgstr "Größe" + +#: uemis.c:134 +msgid "Speed Alarm" +msgstr "Alarm: Geschwindigkeit" + +#: uemis.c:137 +msgid "Speed Warning" +msgstr "Warnung: Geschwindigkeit" + +#: equipment.c:962 equipment.c:1488 +msgid "Start" +msgstr "Start" + +#: statistics.c:640 +msgid "Statistics" +msgstr "Statistiken" + +#: gtk-gui.c:1124 +msgid "Stats" +msgstr "Statistiken" + +#: divelist.c:1264 gtk-gui.c:645 info.c:490 info.c:917 +msgid "Suit" +msgstr "Taucheranzug" + +#. ++GETTEXT: these are three character days +#: main.c:38 +msgid "Sun" +msgstr "So" + +#: statistics.c:698 +msgid "Surf Intv" +msgstr "Oberflächenzeit" + +#: print.c:488 +msgid "Table print" +msgstr "Tabellenausdruck" + +#: uemis.c:154 +msgid "Tank Change Suggested" +msgstr "Tank-Wechsel Vorschlag" + +#: uemis.c:148 +msgid "Tank Pressure Info" +msgstr "Info: Tankdruck" + +#: gtk-gui.c:615 +msgid "Temp" +msgstr "Temperatur" + +#: statistics.c:162 +msgid "" +"Temperature\n" +"Average" +msgstr "" +"Temperatur\n" +"Durchschnitt" + +#: gtk-gui.c:599 +msgid "Temperature:" +msgstr "Temperatur:" + +#: gtk-gui.c:922 +msgid "Three" +msgstr "Drei" + +#: main.c:38 +msgid "Thu" +msgstr "Do" + +#: info.c:791 print.c:154 +msgid "Time" +msgstr "Zeit" + +#: gtk-gui.c:928 +msgid "Toggle Zoom" +msgstr "Zoom ein-/ausschalten" + +#: statistics.c:657 +msgid "Total Time" +msgstr "Gesamtzeit" + +#: main.c:38 +msgid "Tue" +msgstr "Di" + +#: equipment.c:1485 equipment.c:1513 +msgid "Type" +msgstr "Typ" + +#: uemis-downloader.c:28 +msgid "" +"Uemis Zurich: File System is almost full\n" +"Disconnect/reconnect the dive computer\n" +"and try again" +msgstr "" +"Uemis Zurich: Dateisystem beinahe voll\n" +"Bitte den Tauchcomputer ausstecken und wieder einstecken\n" +"und erneut versuchen" + +#: uemis-downloader.c:29 +msgid "" +"Uemis Zurich: File System is full\n" +"Disconnect/reconnect the dive computer\n" +"and try again" +msgstr "" +"Uemis Zurich: Dateisystem voll\n" +"Bitte den Tauchcomputer ausstecken und wieder einstecken\n" +"und erneut versuchen" + +#: uemis-downloader.c:559 +msgid "Uemis init failed" +msgstr "Uemis Initialisierung fehlgeschlagen" + +#: gtk-gui.c:577 +msgid "Units" +msgstr "Einheiten" + +#: gtk-gui.c:901 +msgid "View" +msgstr "Ansicht" + +#: gtk-gui.c:594 +msgid "Volume:" +msgstr "Volumen:" + +#: statistics.c:706 +msgid "Water Temp" +msgstr "Wassertemperatur" + +#: main.c:38 +msgid "Wed" +msgstr "Mi" + +#: equipment.c:1012 equipment.c:1609 gtk-gui.c:640 +msgid "Weight" +msgstr "Gewicht" + +#: equipment.c:1117 +msgid "Weight System" +msgstr "Gewicht" + +#: gtk-gui.c:604 +msgid "Weight:" +msgstr "Gewicht:" + +#: gtk-gui.c:153 +msgid "XML file" +msgstr "XML Datei" + +#: statistics.c:160 +msgid "" +"Year\n" +" > Month" +msgstr "" +"Jahr\n" +" > Monat" + +#: gtk-gui.c:915 statistics.c:345 +msgid "Yearly Statistics" +msgstr "Jährliche Statistiken" + +#: gtk-gui.c:238 +msgid "" +"You have unsaved changes\n" +"Would you like to save those before closing the datafile?" +msgstr "" +"Nicht alle Änderungen wurden gespeichert.\n" +"Sollen Änderungen vor dem Schließen der Datei gespeichert werden_" + +#: gtk-gui.c:242 +#, c-format +msgid "" +"You have unsaved changes to file: %s \n" +"Would you like to save those before closing the datafile?" +msgstr "" +"Nicht alle Änderungen in der Dati %s wurden gespeichert.\n" +"Sollen Änderungen vor dem Schließen der Datei gespeichert werden_" + +#: equipment.c:824 +msgid "ankle" +msgstr "Fuß" + +#: equipment.c:825 +msgid "bar" +msgstr "bar" + +#: equipment.c:823 +msgid "belt" +msgstr "Gürtel" + +#: equipment.c:826 +msgid "clip-on" +msgstr "clip-on" + +#: divelist.c:1260 +msgid "ft" +msgstr "ft" + +#: equipment.c:822 +msgid "integrated" +msgstr "integriert" + +#: gtk-gui.c:605 +msgid "kg" +msgstr "kg" + +#: divelist.c:1263 gtk-gui.c:606 +msgid "lbs" +msgstr "US Pfund" + +#: divelist.c:1261 +msgid "min" +msgstr "min" + +#: statistics.c:478 +#, c-format +msgid "more than %d days" +msgstr "mehr als %d Tage" + +#: equipment.c:1378 equipment.c:1398 +msgid "unkn" +msgstr "unbk" + +#: statistics.c:517 +msgid "unknown" +msgstr "unbekannt" + +#: equipment.c:544 +msgid "unspecified" +msgstr "nicht angegeben" + +#: equipment.c:1514 +msgid "weight" +msgstr "Gewicht" diff --git a/print.c b/print.c index 5adba94cd..1d4f68f07 100644 --- a/print.c +++ b/print.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -63,7 +64,7 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, *divenr = 0; if (dive->number) - snprintf(divenr, sizeof(divenr), "Dive #%d - ", dive->number); + snprintf(divenr, sizeof(divenr), _("Dive #%d - "), dive->number); utc_mkdate(dive->when, &tm); len = snprintf(buffer, sizeof(buffer), @@ -90,9 +91,7 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, depth = get_depth_units(dive->maxdepth.mm, &decimals, &unit); snprintf(buffer, sizeof(buffer), - "Max depth: %.*f %s\n" - "Duration: %d min\n" - "%s", + _("Max depth: %.*f %s\nDuration: %d min\n%s"), decimals, depth, unit, (dive->duration.seconds+59) / 60, people); @@ -152,8 +151,8 @@ static void show_table_header(cairo_t *cr, double w, double h, int i; double maxwidth, maxheight, colwidth, curwidth; PangoLayout *layout; - char headers[7][80]= { "Dive#", "Date", "Depth", "Time", "Master", - "Buddy", "Location" }; + char headers[7][80]= { N_("Dive#"), N_("Date"), N_("Depth"), N_("Time"), N_("Master"), + N_("Buddy"), N_("Location") }; maxwidth = w * PANGO_SCALE; maxheight = h * PANGO_SCALE * 0.9; @@ -177,7 +176,7 @@ static void show_table_header(cairo_t *cr, double w, double h, pango_layout_set_width(layout, colwidth); curwidth = curwidth + colwidth; } - pango_layout_set_text(layout, headers[i], -1); + pango_layout_set_text(layout, _(headers[i]), -1); pango_layout_set_justify(layout, 1); pango_cairo_show_layout(cr, layout); } @@ -250,7 +249,7 @@ static void show_dive_table(struct dive *dive, cairo_t *cr, double w, // Col 4: Time len = snprintf(buffer, sizeof(buffer), - "%d min",(dive->duration.seconds+59) / 60); + _("%d min"),(dive->duration.seconds+59) / 60); cairo_move_to(cr, curwidth / PANGO_SCALE, 0); pango_layout_set_width(layout, colwidth/ (double) 2); pango_layout_set_text(layout, buffer, len); @@ -472,21 +471,21 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) { GtkWidget *vbox, *radio1, *radio2, *frame, *box; int dives; - gtk_print_operation_set_custom_tab_label(operation, "Dive details"); + gtk_print_operation_set_custom_tab_label(operation, _("Dive details")); vbox = gtk_vbox_new(TRUE, 5); - frame = gtk_frame_new("Print type"); + frame = gtk_frame_new(_("Print type")); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 1); box = gtk_hbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(frame), box); - radio1 = gtk_radio_button_new_with_label (NULL, "Pretty print"); + radio1 = gtk_radio_button_new_with_label (NULL, _("Pretty print")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio1), print_options.type == PRETTY); radio2 = gtk_radio_button_new_with_label_from_widget ( - GTK_RADIO_BUTTON (radio1), "Table print"); + GTK_RADIO_BUTTON (radio1), _("Table print")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio2), print_options.type == TABLE); gtk_box_pack_start (GTK_BOX (box), radio1, TRUE, TRUE, 0); @@ -498,12 +497,12 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) dives = nr_selected_dives(); print_options.print_selected = dives >= 1; if (print_options.print_selected) { - frame = gtk_frame_new("Print selection"); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 1); - box = gtk_hbox_new(FALSE, 1); - gtk_container_add(GTK_CONTAINER(frame), box); + frame = gtk_frame_new(_("Print selection")); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 1); + box = gtk_hbox_new(FALSE, 1); + gtk_container_add(GTK_CONTAINER(frame), box); GtkWidget *button; - button = gtk_check_button_new_with_label("Print only selected dives"); + button = gtk_check_button_new_with_label(_("Print only selected dives")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), print_options.print_selected); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 2); diff --git a/profile.c b/profile.c index 3a3df043c..9e06e79e5 100644 --- a/profile.c +++ b/profile.c @@ -2,6 +2,7 @@ /* creates all the necessary data for drawing the dive profile * uses cairo to draw it */ +#include #include #include #include diff --git a/statistics.c b/statistics.c index d7757b914..06aeb2c57 100644 --- a/statistics.c +++ b/statistics.c @@ -8,6 +8,7 @@ * called from gtk-ui: * GtkWidget *stats_widget(void) */ +#include #include #include #include @@ -156,15 +157,15 @@ static void init_tree() renderer = gtk_cell_renderer_text_new (); char *columns[] = { - "Year\n > Month", "#", "Duration\nTotal", "\nAverage", - "\nShortest", "\nLongest", "Depth\nAverage", "\nMinimum", - "\nMaximum", "SAC\nAverage", "\nMinimum", "\nMaximum", "Temperature\nAverage", - "\nMinimum", "\nMaximum" }; + N_("Year\n > Month"), "#", N_("Duration\nTotal"), N_("\nAverage"), + N_("\nShortest"), N_("\nLongest"), N_("Depth\nAverage"), N_("\nMinimum"), + N_("\nMaximum"), N_("SAC\nAverage"), N_("\nMinimum"), N_("\nMaximum"), N_("Temperature\nAverage"), + N_("\nMinimum"), N_("\nMaximum") }; /* Add all the columns to the tree view */ for (i = 0; i < N_COLUMNS; ++i) { column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, columns[i]); + gtk_tree_view_column_set_title(column, _(columns[i])); gtk_tree_view_append_column(GTK_TREE_VIEW(yearly_tree), column); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); @@ -341,7 +342,7 @@ void show_yearly_stats() gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 640, 480); - gtk_window_set_title(GTK_WINDOW(window), "Yearly Statistics"); + gtk_window_set_title(GTK_WINDOW(window), _("Yearly Statistics")); gtk_container_set_border_width(GTK_CONTAINER(window), 5); GTK_WINDOW(window)->allow_shrink = TRUE; gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); @@ -474,15 +475,15 @@ static char * get_time_string(int seconds, int maxdays) { static char buf[80]; if (maxdays && seconds > 3600 * 24 * maxdays) - snprintf(buf, sizeof(buf), "more than %d days", maxdays); + snprintf(buf, sizeof(buf), _("more than %d days"), maxdays); else { int days = seconds / 3600 / 24; int hours = (seconds - days * 3600 * 24) / 3600; int minutes = (seconds - days * 3600 * 24 - hours * 3600) / 60; if (days > 0) - snprintf(buf, sizeof(buf), "%dd %dh %dmin", days, hours, minutes); + snprintf(buf, sizeof(buf), _("%dd %dh %dmin"), days, hours, minutes); else - snprintf(buf, sizeof(buf), "%dh %dmin", hours, minutes); + snprintf(buf, sizeof(buf), _("%dh %dmin"), hours, minutes); } return buf; } @@ -508,12 +509,12 @@ static void show_single_dive_stats(struct dive *dive) tm.tm_hour, tm.tm_min); set_label(single_w.date, buf); - set_label(single_w.dive_time, "%d min", (dive->duration.seconds + 30) / 60); + set_label(single_w.dive_time, _("%d min"), (dive->duration.seconds + 30) / 60); if (prev_dive) set_label(single_w.surf_intv, get_time_string(dive->when - (prev_dive->when + prev_dive->duration.seconds), 4)); else - set_label(single_w.surf_intv, "unknown"); + set_label(single_w.surf_intv, _("unknown")); value = get_depth_units(dive->maxdepth.mm, &decimals, &unit); set_label(single_w.max_depth, "%.*f %s", decimals, value, unit); value = get_depth_units(dive->meandepth.mm, &decimals, &unit); @@ -597,11 +598,11 @@ static void show_total_dive_stats(struct dive *dive) value = get_depth_units(stats_ptr->avg_depth.mm, &decimals, &unit); set_label(stats_w.avg_overall_depth, "%.*f %s", decimals, value, unit); value = get_volume_units(stats_ptr->max_sac.mliter, &decimals, &unit); - set_label(stats_w.max_sac, "%.*f %s/min", decimals, value, unit); + set_label(stats_w.max_sac, _("%.*f %s/min"), decimals, value, unit); value = get_volume_units(stats_ptr->min_sac.mliter, &decimals, &unit); - set_label(stats_w.min_sac, "%.*f %s/min", decimals, value, unit); + set_label(stats_w.min_sac, _("%.*f %s/min"), decimals, value, unit); value = get_volume_units(stats_ptr->avg_sac.mliter, &decimals, &unit); - set_label(stats_w.avg_sac, "%.*f %s/min", decimals, value, unit); + set_label(stats_w.avg_sac, _("%.*f %s/min"), decimals, value, unit); } void show_dive_stats(struct dive *dive) @@ -636,7 +637,7 @@ GtkWidget *total_stats_widget(void) vbox = gtk_vbox_new(FALSE, 3); - statsframe = gtk_frame_new("Statistics"); + statsframe = gtk_frame_new(_("Statistics")); gtk_box_pack_start(GTK_BOX(vbox), statsframe, TRUE, FALSE, 3); framebox = gtk_vbox_new(FALSE, 3); gtk_container_add(GTK_CONTAINER(statsframe), framebox); @@ -644,35 +645,35 @@ GtkWidget *total_stats_widget(void) /* first row */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - stats_w.selection_size = new_info_label_in_frame(hbox, "Dives"); - stats_w.max_temp = new_info_label_in_frame(hbox, "Max Temp"); - stats_w.min_temp = new_info_label_in_frame(hbox, "Min Temp"); - stats_w.avg_temp = new_info_label_in_frame(hbox, "Avg Temp"); + stats_w.selection_size = new_info_label_in_frame(hbox, _("Dives")); + stats_w.max_temp = new_info_label_in_frame(hbox, _("Max Temp")); + stats_w.min_temp = new_info_label_in_frame(hbox, _("Min Temp")); + stats_w.avg_temp = new_info_label_in_frame(hbox, _("Avg Temp")); /* second row */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - stats_w.total_time = new_info_label_in_frame(hbox, "Total Time"); - stats_w.avg_time = new_info_label_in_frame(hbox, "Avg Time"); - stats_w.longest_time = new_info_label_in_frame(hbox, "Longest Dive"); - stats_w.shortest_time = new_info_label_in_frame(hbox, "Shortest Dive"); + stats_w.total_time = new_info_label_in_frame(hbox, _("Total Time")); + stats_w.avg_time = new_info_label_in_frame(hbox, _("Avg Time")); + stats_w.longest_time = new_info_label_in_frame(hbox, _("Longest Dive")); + stats_w.shortest_time = new_info_label_in_frame(hbox, _("Shortest Dive")); /* third row */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - stats_w.max_overall_depth = new_info_label_in_frame(hbox, "Max Depth"); - stats_w.min_overall_depth = new_info_label_in_frame(hbox, "Min Depth"); - stats_w.avg_overall_depth = new_info_label_in_frame(hbox, "Avg Depth"); + stats_w.max_overall_depth = new_info_label_in_frame(hbox, _("Max Depth")); + stats_w.min_overall_depth = new_info_label_in_frame(hbox, _("Min Depth")); + stats_w.avg_overall_depth = new_info_label_in_frame(hbox, _("Avg Depth")); /* fourth row */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - stats_w.max_sac = new_info_label_in_frame(hbox, "Max SAC"); - stats_w.min_sac = new_info_label_in_frame(hbox, "Min SAC"); - stats_w.avg_sac = new_info_label_in_frame(hbox, "Avg SAC"); + stats_w.max_sac = new_info_label_in_frame(hbox, _("Max SAC")); + stats_w.min_sac = new_info_label_in_frame(hbox, _("Min SAC")); + stats_w.avg_sac = new_info_label_in_frame(hbox, _("Avg SAC")); return vbox; } @@ -683,7 +684,7 @@ GtkWidget *single_stats_widget(void) vbox = gtk_vbox_new(FALSE, 3); - infoframe = gtk_frame_new("Dive Info"); + infoframe = gtk_frame_new(_("Dive Info")); gtk_box_pack_start(GTK_BOX(vbox), infoframe, TRUE, FALSE, 3); framebox = gtk_vbox_new(FALSE, 3); gtk_container_add(GTK_CONTAINER(infoframe), framebox); @@ -692,26 +693,26 @@ GtkWidget *single_stats_widget(void) hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - single_w.date = new_info_label_in_frame(hbox, "Date"); - single_w.dive_time = new_info_label_in_frame(hbox, "Dive Time"); - single_w.surf_intv = new_info_label_in_frame(hbox, "Surf Intv"); + single_w.date = new_info_label_in_frame(hbox, _("Date")); + single_w.dive_time = new_info_label_in_frame(hbox, _("Dive Time")); + single_w.surf_intv = new_info_label_in_frame(hbox, _("Surf Intv")); /* second row */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - single_w.max_depth = new_info_label_in_frame(hbox, "Max Depth"); - single_w.avg_depth = new_info_label_in_frame(hbox, "Avg Depth"); - single_w.water_temp = new_info_label_in_frame(hbox, "Water Temp"); + single_w.max_depth = new_info_label_in_frame(hbox, _("Max Depth")); + single_w.avg_depth = new_info_label_in_frame(hbox, _("Avg Depth")); + single_w.water_temp = new_info_label_in_frame(hbox, _("Water Temp")); /* third row */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - single_w.sac = new_info_label_in_frame(hbox, "SAC"); - single_w.otu = new_info_label_in_frame(hbox, "OTU"); + single_w.sac = new_info_label_in_frame(hbox, _("SAC")); + single_w.otu = new_info_label_in_frame(hbox, _("OTU")); single_w.o2he = new_info_label_in_frame(hbox, "O" UTF8_SUBSCRIPT_2 " / He"); - single_w.gas_used = new_info_label_in_frame(hbox, "Gas Used"); + single_w.gas_used = new_info_label_in_frame(hbox, _("Gas Used")); return vbox; } diff --git a/time.c b/time.c index ed8222a0f..36a834400 100644 --- a/time.c +++ b/time.c @@ -1,3 +1,4 @@ +#include #include #include "dive.h" diff --git a/uemis-downloader.c b/uemis-downloader.c index 1fec353a8..5d7881291 100644 --- a/uemis-downloader.c +++ b/uemis-downloader.c @@ -17,15 +17,17 @@ #include #include #include +#include + #include "uemis.h" #include "dive.h" #include "divelist.h" #include "display.h" #include "display-gtk.h" -#define ERR_FS_ALMOST_FULL "Uemis Zurich: File System is almost full\nDisconnect/reconnect the dive computer\nand try again" -#define ERR_FS_FULL "Uemis Zurich: File System is full\nDisconnect/reconnect the dive computer\nand try again" -#define ERR_FS_SHORT_WRITE "Short write to req.txt file\nIs the Uemis Zurich plugged in correctly?" +#define ERR_FS_ALMOST_FULL N_("Uemis Zurich: File System is almost full\nDisconnect/reconnect the dive computer\nand try again") +#define ERR_FS_FULL N_("Uemis Zurich: File System is full\nDisconnect/reconnect the dive computer\nand try again") +#define ERR_FS_SHORT_WRITE N_("Short write to req.txt file\nIs the Uemis Zurich plugged in correctly?") #define BUFLEN 2048 #define NUM_PARAM_BUFS 6 #define UEMIS_TIMEOUT 100000 @@ -262,7 +264,7 @@ static void show_progress(char *buf) while (*p != '{' && t < tmp + 9) *t++ = *p++; *t = '\0'; - uemis_info("Reading dive %s", tmp); + uemis_info(_("Reading dive %s"), tmp); } } } @@ -301,11 +303,11 @@ static gboolean uemis_get_answer(const char *path, char *request, int n_param_in fprintf(debugfile,"::w req.txt \"%s\"\n", sb); #endif if (write(reqtxt_file, sb, strlen(sb)) != strlen(sb)) { - *error_text = ERR_FS_SHORT_WRITE; + *error_text = _(ERR_FS_SHORT_WRITE); return FALSE; } if (! next_file(number_of_files)) { - *error_text = ERR_FS_FULL; + *error_text = _(ERR_FS_FULL); more_files = FALSE; } trigger_response(reqtxt_file, "n", filenr, file_length); @@ -334,7 +336,7 @@ static gboolean uemis_get_answer(const char *path, char *request, int n_param_in assembling_mbuf = FALSE; if (assembling_mbuf) { if (! next_file(number_of_files)) { - *error_text = ERR_FS_FULL; + *error_text = _(ERR_FS_FULL); more_files = FALSE; assembling_mbuf = FALSE; } @@ -343,7 +345,7 @@ static gboolean uemis_get_answer(const char *path, char *request, int n_param_in } } else { if (! next_file(number_of_files - 1)) { - *error_text = ERR_FS_FULL; + *error_text = _(ERR_FS_FULL); more_files = FALSE; assembling_mbuf = FALSE; searching = FALSE; @@ -554,7 +556,7 @@ static char *do_uemis_download(struct argument_block *args) buffer_add(xml_buffer, &xml_buffer_size, "\n\n"); uemis_info("Init Communication"); if (! uemis_init(mountpath)) - return "Uemis init failed"; + return _("Uemis init failed"); if (! uemis_get_answer(mountpath, "getDeviceId", 0, 1, &result)) goto bail; deviceid = strdup(param_buff[0]); @@ -587,7 +589,7 @@ static char *do_uemis_download(struct argument_block *args) break; /* finally, if the memory is getting too full, maybe we better stop, too */ if (progress_bar_fraction > 0.85) { - result = ERR_FS_ALMOST_FULL; + result = _(ERR_FS_ALMOST_FULL); break; } /* clean up mbuf */ @@ -601,7 +603,7 @@ static char *do_uemis_download(struct argument_block *args) goto bail; if (! strcmp(param_buff[0], "error")) { if (! strcmp(param_buff[2],"Out of Memory")) - result = ERR_FS_FULL; + result = _(ERR_FS_FULL); else result = param_buff[2]; } diff --git a/uemis.c b/uemis.c index 557c419f3..1ac458458 100644 --- a/uemis.c +++ b/uemis.c @@ -12,6 +12,7 @@ #include #include #include +#include #define __USE_XOPEN #include @@ -128,45 +129,45 @@ void uemis_event(struct dive *dive, struct sample *sample, uemis_sample_t *u_sam uint8_t *flags = u_sample->flags; if (flags[1] & 0x01) - add_event(dive, sample->time.seconds, 0, 0, 0, "Safety Stop Violation"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Safety Stop Violation")); if (flags[1] & 0x08) - add_event(dive, sample->time.seconds, 0, 0, 0, "Speed Alarm"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Speed Alarm")); #if WANT_CRAZY_WARNINGS if (flags[1] & 0x06) /* both bits 1 and 2 are a warning */ - add_event(dive, sample->time.seconds, 0, 0, 0, "Speed Warning"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Speed Warning")); if (flags[1] & 0x10) - add_event(dive, sample->time.seconds, 0, 0, 0, "PO2 Green Warning"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("PO2 Green Warning")); #endif if (flags[1] & 0x20) - add_event(dive, sample->time.seconds, 0, 0, 0, "PO2 Ascend Warning"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("PO2 Ascend Warning")); if (flags[1] & 0x40) - add_event(dive, sample->time.seconds, 0, 0, 0, "PO2 Ascend Alarm"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("PO2 Ascend Alarm")); /* flags[2] reflects the deco / time bar * flags[3] reflects more display details on deco and pO2 */ if (flags[4] & 0x01) - add_event(dive, sample->time.seconds, 0, 0, 0, "Tank Pressure Info"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Tank Pressure Info")); if (flags[4] & 0x04) - add_event(dive, sample->time.seconds, 0, 0, 0, "RGT Warning"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("RGT Warning")); if (flags[4] & 0x08) - add_event(dive, sample->time.seconds, 0, 0, 0, "RGT Alert"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("RGT Alert")); if (flags[4] & 0x40) - add_event(dive, sample->time.seconds, 0, 0, 0, "Tank Change Suggested"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Tank Change Suggested")); if (flags[4] & 0x80) - add_event(dive, sample->time.seconds, 0, 0, 0, "Depth Limit Exceeded"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Depth Limit Exceeded")); if (flags[5] & 0x01) - add_event(dive, sample->time.seconds, 0, 0, 0, "Max Deco Time Warning"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Max Deco Time Warning")); if (flags[5] & 0x04) - add_event(dive, sample->time.seconds, 0, 0, 0, "Dive Time Info"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Dive Time Info")); if (flags[5] & 0x08) - add_event(dive, sample->time.seconds, 0, 0, 0, "Dive Time Alert"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Dive Time Alert")); if (flags[5] & 0x10) - add_event(dive, sample->time.seconds, 0, 0, 0, "Marker"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Marker")); if (flags[6] & 0x02) - add_event(dive, sample->time.seconds, 0, 0, 0, "No Tank Data"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("No Tank Data")); if (flags[6] & 0x04) - add_event(dive, sample->time.seconds, 0, 0, 0, "Low Battery Warning"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Low Battery Warning")); if (flags[6] & 0x08) - add_event(dive, sample->time.seconds, 0, 0, 0, "Low Battery Alert"); + add_event(dive, sample->time.seconds, 0, 0, 0, _("Low Battery Alert")); /* flags[7] reflects the little on screen icons that remind of previous * warnings / alerts - not useful for events */ } -- cgit v1.2.3-70-g09d2