Merge branch 'fix/ui-full-i18n' into 'main'

feat(client/lang): full UI i18n impl for each language

See merge request cse1105/2025-2026/teams/csep-team-76!95
This commit is contained in:
Natalia Cholewa 2026-01-24 13:52:56 +01:00
commit 2c4384872c
27 changed files with 510 additions and 241 deletions

View file

@ -56,6 +56,7 @@ public class FoodpalApplicationCtrl implements LocaleAware {
private final LocaleManager localeManager;
private final WebSocketDataService<Long, Recipe> dataService;
private final Logger logger = Logger.getLogger(FoodpalApplicationCtrl.class.getName());
public Button shoppingListButton;
@FXML
private RecipeDetailCtrl recipeDetailController;
@ -304,13 +305,13 @@ public class FoodpalApplicationCtrl implements LocaleAware {
@Override
public void updateText() {
recipesLabel.setText(getLocaleString("app.word.recipe.n"));
addRecipeButton.setText(getLocaleString("menu.button.add.recipe"));
removeRecipeButton.setText(getLocaleString("menu.button.remove.recipe"));
cloneRecipeButton.setText(getLocaleString("menu.button.clone"));
recipesLabel.setText(getLocaleString("menu.label.recipes"));
favouritesOnlyToggle.setText(getLocaleString("menu.button.favourites"));
manageIngredientsButton.setText(getLocaleString("menu.button.ingredients"));
shoppingListButton.setText(getLocaleString("app.list"));
manageIngredientsButton.setText(getLocaleString("app.word.ingredient.n"));
}
@Override
@ -517,7 +518,7 @@ public class FoodpalApplicationCtrl implements LocaleAware {
public void openShoppingListWindow() throws IOException {
var root = UI.getFXML().load(ShoppingListCtrl.class, "client", "scenes", "shopping", "ShoppingList.fxml");
Stage stage = new Stage();
stage.setTitle(this.getLocaleString("menu.shopping.title"));
stage.setTitle(this.getLocaleString("app.list"));
stage.setScene(new Scene(root.getValue()));
stage.show();
}

View file

@ -58,7 +58,7 @@ public class IngredientListCtrl implements LocaleAware {
ingredientsLabel.setText(getLocaleString("menu.label.ingredients"));
addButton.setText(getLocaleString("menu.button.add"));
refreshButton.setText(getLocaleString("menu.button.refresh"));
deleteButton.setText(getLocaleString("menu.button.delete"));
deleteButton.setText(getLocaleString("verb.delete"));
closeButton.setText(getLocaleString("menu.button.close"));
}

View file

@ -66,7 +66,17 @@ public class NutritionDetailsCtrl implements LocaleAware {
this.proteinInputElement.textProperty().bindBidirectional(vm.proteinProperty(), new NumberStringConverter());
this.carbInputElement.textProperty().bindBidirectional(vm.carbsProperty(), new NumberStringConverter());
this.estimatedKcalLabel.textProperty().bind(Bindings.createStringBinding(
() -> String.format("Estimated energy value: %.1f kcal/100g", vm.getKcal()), vm.kcalProperty()
() -> String.format(getLocaleString("app.kcal") + " %.1f kcal/100g", vm.getKcal()), vm.kcalProperty()
));
this.usageLabel.textProperty().bind(Bindings.createStringBinding(
() -> {
Long id = this.ingredient.get().toIngredient().getId();
logger.info("Fetching usage for ingredient ID: " + id);
return !id.equals(0L) ? String.format(
getLocaleString("app.label.usage.part") + " %d " + getLocaleString("app.word.recipe.n"),
server.getIngredientUsage(id)) : "";
},
this.ingredient.get().idProperty()
));
});
this.nutritionValueContainer.addEventHandler(KeyEvent.KEY_RELEASED, event -> {

View file

@ -1,5 +1,7 @@
package client.scenes.recipe;
import client.utils.LocaleAware;
import client.utils.LocaleManager;
import client.utils.server.ServerUtils;
import com.google.inject.Inject;
import commons.FormalIngredient;
@ -32,13 +34,18 @@ import java.util.logging.Logger;
*
* @see IngredientListCtrl
*/
public class IngredientListCell extends OrderedEditableListCell<RecipeIngredient> {
public class IngredientListCell extends OrderedEditableListCell<RecipeIngredient> implements LocaleAware {
private final ServerUtils server;
private final LocaleManager locale;
private final Logger logger = Logger.getLogger(IngredientListCell.class.getName());
private final SimpleObjectProperty<Ingredient> selectedIngredient = new SimpleObjectProperty<>();
@Inject
public IngredientListCell(ServerUtils server) {
public IngredientListCell(
ServerUtils server,
LocaleManager locale
) {
this.server = server;
this.locale = locale;
}
@Override
public void commitEdit(RecipeIngredient newValue) {
@ -101,11 +108,11 @@ public class IngredientListCell extends OrderedEditableListCell<RecipeIngredient
Consumer<T> onSelect,
HBox container) {
MenuItem newIngredientItem = new MenuItem();
newIngredientItem.setText("Something new...");
newIngredientItem.setText(getLocaleString("app.prompt.something-new"));
// on new ingredient click
newIngredientItem.setOnAction(_ -> {
menu.setText("New Ingredient"); // otherwise the text label on menu refuses to update
menu.setText(getLocaleString("app.prompt.new-ingredient")); // otherwise the text label on menu refuses to update
selectedIngredient.setValue(null); // indicate null to signal a new ingredient creation
logger.info("Making new ingredient");
// TODO printError() integration
@ -128,7 +135,7 @@ public class IngredientListCell extends OrderedEditableListCell<RecipeIngredient
}
}
private HBox makeInputLine(RecipeIngredient ingredient, TextField amountInput, ChoiceBox<Unit> unitChoice) {
MenuButton ingredientSelect = new MenuButton("Select your ingredient");
MenuButton ingredientSelect = new MenuButton(getLocaleString("app.prompt.select-ingredient"));
HBox container = new HBox(amountInput, unitChoice, ingredientSelect);
try {
makeMenuItems(ingredientSelect, server.getIngredients(), Ingredient::getName, i -> {
@ -163,7 +170,7 @@ public class IngredientListCell extends OrderedEditableListCell<RecipeIngredient
}
private @NonNull TextField makeNewIngredientNameField(Consumer<Ingredient> onSubmit) {
TextField newIngredientNameInput = new TextField("New ingredient...");
TextField newIngredientNameInput = new TextField(getLocaleString("app.prompt.new-ingredient"));
newIngredientNameInput.setOnKeyReleased(e -> {
if (e.getCode() != KeyCode.ENTER) {
return;
@ -183,4 +190,14 @@ public class IngredientListCell extends OrderedEditableListCell<RecipeIngredient
});
return newIngredientNameInput;
}
@Override
public void updateText() {
}
@Override
public LocaleManager getLocaleManager() {
return locale;
}
}

View file

@ -173,7 +173,7 @@ public class IngredientListCtrl implements LocaleAware {
this.ingredientListView.setEditable(true);
this.ingredientListView.setCellFactory(
list -> {
return new IngredientListCell(this.server);
return new IngredientListCell(this.server, this.localeManager);
});
this.ingredientListView.setOnEditCommit(this::handleIngredientEdit);

View file

@ -60,6 +60,9 @@ public class RecipeDetailCtrl implements LocaleAware {
public Label inferredKcalLabel;
public Spinner<Integer> servingsSpinner;
public Label inferredServeSizeLabel;
public Label scaleLabel;
public Label servingLabel;
public Button addToListButton;
@FXML
private IngredientListCtrl ingredientListController;
@ -178,13 +181,13 @@ public class RecipeDetailCtrl implements LocaleAware {
this.recipeView = new ScalableRecipeView(recipe, scale);
// TODO i18n
inferredKcalLabel.textProperty().bind(Bindings.createStringBinding(() ->
String.format("Inferred %.1f kcal/100g for this recipe",
String.format(getLocaleString("app.label.inferred-kcal") + " %.1f kcal/100g",
Double.isNaN(this.recipeView.scaledKcalProperty().get()) ?
0.0 : this.recipeView.scaledKcalProperty().get())
, this.recipeView.scaledKcalProperty()));
recipeView.servingsProperty().set(servingsSpinner.getValue());
inferredServeSizeLabel.textProperty().bind(Bindings.createStringBinding(
() -> String.format("Inferred size per serving: %.1f g", recipeView.servingSizeProperty().get()),
() -> String.format(getLocaleString("app.label.inferred-size") + " %.1f g", recipeView.servingSizeProperty().get()),
recipeView.servingSizeProperty()));
// expose the scaled view to list controllers
this.ingredientListController.refetchFromRecipe(this.recipeView.getScaled());
@ -405,6 +408,9 @@ public class RecipeDetailCtrl implements LocaleAware {
editRecipeTitleButton.setText(getLocaleString("menu.button.edit"));
removeRecipeButton.setText(getLocaleString("menu.button.remove.recipe"));
printRecipeButton.setText(getLocaleString("menu.button.print"));
addToListButton.setText(getLocaleString("app.word.shop"));
scaleLabel.setText(getLocaleString("app.word.scale"));
servingLabel.setText(getLocaleString("app.word.serving.n"));
}
@Override

View file

@ -14,6 +14,8 @@ import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextInputDialog;
@ -31,6 +33,11 @@ public class AddOverviewCtrl implements LocaleAware {
private final ShoppingListService shoppingListService;
private final LocaleManager localeManager;
public Button addButton;
public Button removeSelButton;
public Button cancelButton;
public Button addConfirmButton;
public Label addOverviewTitle;
private String sourceRecipeName;
@ -88,6 +95,13 @@ public class AddOverviewCtrl implements LocaleAware {
@Override
public void updateText() {
amountColumn.setText(getLocaleString("app.word.amount"));
unitColumn.setText(getLocaleString("app.word.unit"));
nameColumn.setText(getLocaleString("app.word.ingredient"));
addButton.setText(getLocaleString("verb.add"));
cancelButton.setText(getLocaleString("verb.cancel"));
addConfirmButton.setText(getLocaleString("verb.addconfirm"));
removeSelButton.setText(getLocaleString("verb.removesel"));
}
@Override

View file

@ -13,7 +13,9 @@ import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TitledPane;
import javafx.stage.FileChooser;
import javafx.stage.Modality;
import javafx.stage.Stage;
@ -23,6 +25,11 @@ import java.io.File;
import java.util.Optional;
public class ShoppingListCtrl implements LocaleAware {
public Button addItemButton;
public Button deleteItemButton;
public Button printButton;
public Button resetButton;
public TitledPane shoppingListContainer;
ShoppingListService shopping;
LocaleManager localeManager;
@ -40,7 +47,11 @@ public class ShoppingListCtrl implements LocaleAware {
@Override
public void updateText() {
shoppingListContainer.setText(getLocaleString("app.list"));
addItemButton.setText(getLocaleString("verb.add"));
deleteItemButton.setText(getLocaleString("verb.delete"));
resetButton.setText(getLocaleString("verb.reset"));
printButton.setText(getLocaleString("verb.print"));
}
@Override

View file

@ -10,6 +10,7 @@ import commons.Unit;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Spinner;
@ -27,6 +28,8 @@ public class ShoppingListNewItemPromptCtrl implements LocaleAware {
private final ObjectProperty<Unit> selectedUnit = new SimpleObjectProperty<>();
private final ServerUtils server;
private final LocaleManager localeManager;
public Button confirmButton;
public Button cancelButton;
private Consumer<FormalIngredient> newValueConsumer;
public MenuButton unitSelect;
public Spinner<Double> amountSelect;
@ -72,7 +75,10 @@ public class ShoppingListNewItemPromptCtrl implements LocaleAware {
}
@Override
public void updateText() {
unitSelect.setText(getLocaleString("app.word.unit"));
ingredientSelection.setText(getLocaleString("app.word.ingredient"));
confirmButton.setText(getLocaleString("verb.confirm"));
cancelButton.setText(getLocaleString("verb.cancel"));
}
@Override
public void initializeComponents() {

View file

@ -5,7 +5,7 @@ import java.util.List;
public class Config {
private String language = "en";
public static String[] languages = {"en", "nl", "pl", "tok", "zhc", "zht"};
public static String[] languages = {"en", "nl", "pl", "tr", "tok", "zhc", "zht"};
private List<String> recipeLanguages = new ArrayList<>();
private String serverUrl = "http://localhost:8080";

View file

@ -52,7 +52,7 @@
</padding>
<fx:include source="LangSelect.fxml" />
<Button fx:id="refreshButton" onAction="#refresh" prefHeight="25.0" prefWidth="34.0" text="⟳" GridPane.columnIndex="3" GridPane.rowIndex="2" />
<Label fx:id="recipesLabel" text="Recipes">
<Label fx:id="recipesLabel" text="%app.word.recipe.n">
<font>
<Font name="System Bold" size="15.0" />
</font>
@ -64,18 +64,18 @@
<ListView fx:id="recipeList" />
<HBox spacing="10">
<Button fx:id="addRecipeButton" onAction="#addRecipe" text="Add Recipe" />
<Button fx:id="removeRecipeButton" onAction="#removeSelectedRecipe" text="Remove Recipe" />
<Button fx:id="cloneRecipeButton" mnemonicParsing="false" onAction="#cloneRecipe" text="Clone" />
<ToggleButton fx:id="favouritesOnlyToggle" text="Favourites" onAction="#toggleFavouritesView" />
<Button fx:id="addRecipeButton" onAction="#addRecipe" text="%menu.button.add.recipe" />
<Button fx:id="removeRecipeButton" onAction="#removeSelectedRecipe" text="%menu.button.remove.recipe" />
<Button fx:id="cloneRecipeButton" mnemonicParsing="false" onAction="#cloneRecipe" text="%menu.button.clone" />
<ToggleButton fx:id="favouritesOnlyToggle" text="%menu.button.favourites" onAction="#toggleFavouritesView" />
</HBox>
<Button fx:id="shoppingListButton"
onAction="#openShoppingListWindow"
text="Shopping List" />
text="%app.list" />
<Button fx:id="manageIngredientsButton"
onAction="#openIngredientsPopup"
text="Ingredients..." />
text="%app.word.ingredient.n" />
</VBox>
</left>
@ -95,7 +95,7 @@
<Insets bottom="16" left="16" right="16" top="8" />
</padding>
<Label fx:id="updatedBadge"
text="Updated just now"
text="%app.updated"
visible="false"
managed="false"
styleClass="updated-badge"/>

View file

@ -6,6 +6,6 @@
<HBox xmlns="http://javafx.com/javafx/25" xmlns:fx="http://javafx.com/fxml/1" fx:controller="client.scenes.SearchBarCtrl">
<children>
<TextField fx:id="searchField" promptText="Search..." />
<TextField fx:id="searchField" promptText="%menu.search" />
</children>
</HBox>

View file

@ -21,7 +21,7 @@
<Label GridPane.columnIndex="0" GridPane.rowIndex="2" fx:id="carbInputLabel">Carbohydrates: </Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="2" fx:id="carbInputElement" />
</GridPane>
<Button onAction="#handleNutritionSaveClick">Save values</Button>
<Label fx:id="estimatedKcalLabel">Estimated: 0kcal</Label>
<Label fx:id="usageLabel">Not used in any recipes</Label>
<Button onAction="#handleNutritionSaveClick" text="%verb.save" />
<Label fx:id="estimatedKcalLabel" />
<Label fx:id="usageLabel" />
</VBox>

View file

@ -21,18 +21,18 @@
<HBox spacing="10">
<HBox fx:id="editableTitleArea">
</HBox>
<Button fx:id="editRecipeTitleButton" onAction="#editRecipeTitle" text="Edit" />
<Button fx:id="removeRecipeButton" mnemonicParsing="false" onAction="#removeSelectedRecipe" text="Remove Recipe" />
<Button fx:id="printRecipeButton" mnemonicParsing="false" onAction="#printRecipe" text="Print Recipe" />
<Button fx:id="editRecipeTitleButton" onAction="#editRecipeTitle" text="%menu.button.edit" />
<Button fx:id="removeRecipeButton" mnemonicParsing="false" onAction="#removeSelectedRecipe" text="%menu.button.remove.recipe" />
<Button fx:id="printRecipeButton" mnemonicParsing="false" onAction="#printRecipe" text="%menu.button.print" />
<Button fx:id="favouriteButton" onAction="#toggleFavourite" text="☆" />
<Button onAction="#handleAddAllToShoppingList">Shop</Button>
<Button fx:id="addToListButton" onAction="#handleAddAllToShoppingList" text="%app.word.shop" />
</HBox>
<HBox>
<ComboBox fx:id="langSelector" onAction="#changeLanguage" />
<Label>Scale: </Label>
<Label fx:id="scaleLabel" text="%app.word.scale" />
<Spinner fx:id="scaleSpinner" />
<Label>Servings: </Label>
<Label fx:id="servingLabel" text="%app.word.serving.n" />
<Spinner fx:id="servingsSpinner" />
</HBox>

View file

@ -16,7 +16,7 @@
<children>
<HBox alignment="CENTER_LEFT" spacing="20.0">
<children>
<Label fx:id="ingredientsLabel" text="Ingredients">
<Label fx:id="ingredientsLabel" text="%app.word.ingredient.n">
<padding>
<Insets bottom="5.0" top="5.0" />
</padding>
@ -26,8 +26,8 @@
</Label>
<HBox alignment="CENTER" spacing="10.0">
<children>
<Button fx:id="addIngredientButton" mnemonicParsing="false" text="Add" />
<Button fx:id="deleteIngredientButton" mnemonicParsing="false" text="Delete" />
<Button fx:id="addIngredientButton" mnemonicParsing="false" text="%verb.add" />
<Button fx:id="deleteIngredientButton" mnemonicParsing="false" text="%verb.delete" />
</children>
</HBox>
</children>

View file

@ -15,7 +15,7 @@
<children>
<HBox alignment="CENTER_LEFT" spacing="20.0">
<children>
<Label fx:id="stepsLabel" text="Steps">
<Label fx:id="stepsLabel" text="%app.word.step.n">
<padding>
<Insets bottom="5.0" top="5.0" />
</padding>
@ -25,8 +25,8 @@
</Label>
<HBox alignment="CENTER" spacing="10.0">
<children>
<Button fx:id="addStepButton" mnemonicParsing="false" text="Add" />
<Button fx:id="deleteStepButton" mnemonicParsing="false" text="Delete" />
<Button fx:id="addStepButton" mnemonicParsing="false" text="%verb.add" />
<Button fx:id="deleteStepButton" mnemonicParsing="false" text="%verb.delete" />
</children>
</HBox>
</children>

View file

@ -11,22 +11,22 @@
<VBox spacing="10.0" AnchorPane.topAnchor="10.0" AnchorPane.leftAnchor="10.0"
AnchorPane.rightAnchor="10.0" AnchorPane.bottomAnchor="10.0">
<Label text="Review ingredients before adding" />
<Label fx:id="addOverviewTitle" text="%app.title.addoverview" />
<TableView fx:id="overviewTable" editable="true" VBox.vgrow="ALWAYS">
<columns>
<TableColumn fx:id="nameColumn" text="Ingredient" prefWidth="360.0"/>
<TableColumn fx:id="amountColumn" text="Amount" prefWidth="140.0"/>
<TableColumn fx:id="unitColumn" text="Unit" prefWidth="140.0"/>
<TableColumn fx:id="nameColumn" text="%app.word.ingredient" prefWidth="360.0"/>
<TableColumn fx:id="amountColumn" text="%app.word.amount" prefWidth="140.0"/>
<TableColumn fx:id="unitColumn" text="%app.word.unit" prefWidth="140.0"/>
</columns>
</TableView>
<HBox spacing="10.0">
<Button text="Add item" onAction="#handleAddRow"/>
<Button text="Remove selected" onAction="#handleRemoveSelected"/>
<Button fx:id="addButton" text="%verb.add" onAction="#handleAddRow"/>
<Button fx:id="removeSelButton" text="%verb.removesel" onAction="#handleRemoveSelected"/>
<Pane HBox.hgrow="ALWAYS"/>
<Button text="Cancel" onAction="#handleCancel"/>
<Button text="Confirm &amp; Add" onAction="#handleConfirm"/>
<Button fx:id="cancelButton" text="%verb.cancel" onAction="#handleCancel"/>
<Button fx:id="addConfirmButton" text="%verb.addconfirm" onAction="#handleConfirm"/>
</HBox>
</VBox>
</AnchorPane>

View file

@ -8,7 +8,7 @@
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.VBox?>
<TitledPane animated="false" collapsible="false" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" text="Shopping List"
minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" text="%app.list" fx:id="shoppingListContainer"
fx:controller="client.scenes.shopping.ShoppingListCtrl"
xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/25">
<VBox>
@ -16,10 +16,10 @@
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0"/>
<HBox>
<Button onAction="#handleAddItem">Add</Button>
<Button onAction="#handleRemoveItem">Delete</Button>
<Button onAction="#handlePrint">Print</Button>
<Button onAction="#handleReset">Reset</Button>
<Button fx:id="addItemButton" onAction="#handleAddItem" />
<Button fx:id="deleteItemButton" onAction="#handleRemoveItem" />
<Button fx:id="printButton" onAction="#handlePrint" />
<Button fx:id="resetButton" onAction="#handleReset" />
</HBox>
</VBox>
</TitledPane>

View file

@ -17,8 +17,8 @@
<MenuButton fx:id="ingredientSelection">Your ingredient...</MenuButton>
</HBox>
<HBox>
<Button onAction="#confirmAdd">Confirm</Button>
<Button onAction="#cancelAdd">Cancel</Button>
<Button fx:id="confirmButton" onAction="#confirmAdd">Confirm</Button>
<Button fx:id="cancelButton" onAction="#cancelAdd">Cancel</Button>
</HBox>
</VBox>
</AnchorPane>

View file

@ -1,15 +1,3 @@
add.ingredient.title=Add Ingredient
add.recipe.title=Create recipe
add.step.title=Add Step
add.ingredient.label=Ingredient
add.recipe.label=Recipe Name
add.step.label=Step
button.ok=Ok
button.cancel=Cancel
menu.label.recipes=Recipes
menu.label.ingredients=Ingredients
menu.label.preparation=Preparation
@ -17,7 +5,7 @@ menu.button.add.recipe=Add Recipe
menu.button.add.ingredient=Add Ingredient
menu.button.add.step=Add Step
menu.button.favourites=Favourites
menu.button.ingredients=Ingredients
menu.button.remove.recipe=Remove Recipe
menu.button.remove.ingredient=Remove Ingredient
@ -31,9 +19,42 @@ menu.ingredients.title=Nutrition value
menu.button.add=Add
menu.button.refresh=Refresh
menu.button.delete=Delete
menu.button.close=Close
app.word.recipe.n=Recipes
app.updated=Updated just now
app.estimated=Estimated:
app.prompt.something-new=Something new...
app.prompt.new-ingredient=New ingredient...
app.prompt.select-ingredient=Select your ingredient
app.kcal=Estimated energy value:
app.label.usage.part=Used in
app.list=Shopping List
app.title.addoverview=Review ingredients before adding
app.label.inferred-kcal=Inferred calories for this recipe:
app.label.inferred-size=Inferred serving size:
app.word.amount=Amount
app.word.unit=Unit
app.word.shop=Shop
app.word.scale=Scale
app.word.serving.n=Servings
app.word.step.1=Step
app.word.step.n=Steps
app.word.ingredient=Ingredient
app.word.ingredient.n=Ingredients
verb.cancel=Cancel
verb.save=Save
verb.delete=Delete
verb.add=Add
verb.print=Print
verb.reset=Reset
verb.removesel=Remove selected
verb.addconfirm=Confirm and Add
menu.search=Search...
menu.label.selected-langs=Languages

View file

@ -1,15 +1,3 @@
add.ingredient.title=Add Ingredient
add.recipe.title=Create recipe
add.step.title=Add Step
add.ingredient.label=Ingredient
add.recipe.label=Recipe Name
add.step.label=Step
button.ok=Ok
button.cancel=Cancel
menu.label.recipes=Recipes
menu.label.ingredients=Ingredients
menu.label.preparation=Preparation
@ -17,7 +5,7 @@ menu.button.add.recipe=Add Recipe
menu.button.add.ingredient=Add Ingredient
menu.button.add.step=Add Step
menu.button.favourites=Favourites
menu.button.ingredients=Ingredients
menu.button.remove.recipe=Remove Recipe
menu.button.remove.ingredient=Remove Ingredient
@ -31,9 +19,41 @@ menu.ingredients.title=Nutrition value
menu.button.add=Add
menu.button.refresh=Refresh
menu.button.delete=Delete
menu.button.close=Close
app.word.recipe.n=Recipes
app.updated=Updated just now
app.estimated=Estimated:
app.prompt.something-new=Something new...
app.prompt.new-ingredient=New ingredient...
app.prompt.select-ingredient=Select your ingredient
app.kcal=Estimated energy value:
app.label.usage.part=Used in
app.list=Shopping List
app.title.addoverview=Review ingredients before adding
app.label.inferred-kcal=Inferred calories for this recipe:
app.label.inferred-size=Inferred serving size:
app.word.amount=Amount
app.word.unit=Unit
app.word.shop=Shop
app.word.scale=Scale
app.word.serving.n=Servings
app.word.step.1=Step
app.word.step.n=Steps
app.word.ingredient=Ingredient
app.word.ingredient.n=Ingredients
verb.save=Save
verb.delete=Delete
verb.add=Add
verb.print=Print
verb.reset=Reset
verb.removesel=Remove selected
verb.addconfirm=Confirm and Add
menu.search=Search...
menu.label.selected-langs=Languages

View file

@ -1,39 +1,49 @@
add.ingredient.title=Ingredient toevoegen
add.recipe.title=Recept aanmaken
add.step.title=Stap toevoegen
add.ingredient.label=Ingredient
add.recipe.label=Receptnaam
add.step.label=Bereidingsstap
button.ok=Ok
button.cancel=Annuleren
menu.label.recipes=Recepten
menu.label.ingredients=Ingrediënten
menu.label.preparation=Bereiding
menu.button.add.recipe=Recept toevoegen
menu.button.add.ingredient=Ingrediënt toevoegen
menu.button.add.step=Stap toevoegen
menu.button.favourites=Favorieten
menu.button.ingredients=Ingrediënten
menu.button.remove.recipe=Recept verwijderen
menu.button.remove.ingredient=Ingrediënt verwijderen
menu.button.remove.step=Stap verwijderen
menu.button.edit=Bewerken
menu.button.clone=Dupliceren
menu.button.print=Recept afdrukken
menu.ingredients.title=Voedingswaarden
menu.ingredients.title=Voedingswaarde
menu.button.add=Toevoegen
menu.button.refresh=Verversen
menu.button.delete=Verwijderen
menu.button.refresh=Vernieuwen
menu.button.close=Sluiten
app.word.recipe.n=Recepten
app.updated=Zojuist bijgewerkt
app.estimated=Geschat:
app.prompt.something-new=Iets nieuws...
app.prompt.new-ingredient=Nieuw ingrediënt...
app.prompt.select-ingredient=Selecteer ingrediënt
app.kcal=Geschatte energiewaarde:
app.label.usage.part=Gebruikt in
app.list=Boodschappenlijst
app.title.addoverview=Controleer de ingrediënten voordat u ze toevoegt
app.label.inferred-kcal=Afgeleide calorieën voor dit recept:
app.label.inferred-size=Afgeleide portiegrootte:
app.word.amount=Hoeveelheid
app.word.unit=Eenheid
app.word.shop=Winkelen
app.word.scale=Schaal
app.word.serving.n=Porties
app.word.step.1=Stap
app.word.step.n=Stappen
app.word.ingredient=Ingrediënt
app.word.ingredient.n=Ingrediënten
verb.save=Opslaan
verb.delete=Verwijderen
verb.add=Toevoegen
verb.print=Afdrukken
verb.reset=Opnieuw instellen
verb.cancel=Annuleren
verb.removesel=Geselecteerde verwijderen
verb.addconfirm=Bevestigen en toevoegen
menu.search=Zoeken...
menu.label.selected-langs=Talen
menu.shopping.title=Boodschappenlijst
@ -43,6 +53,7 @@ menu.nutrition.protein=Eiwitten
menu.nutrition.fat=Vetten
menu.search=Zoeken...
lang.en.display=Engels
lang.nl.display=Nederlands
lang.pl.display=Pools

View file

@ -1,48 +1,78 @@
add.ingredient.title=Dodaj skÅadnik
add.recipe.title=Utwórz przepis
add.step.title=Dodaj instrukcjÄ™
add.ingredient.label=SkÅadnik
add.recipe.label=Nazwa przepisu
add.step.label=Instrukcja
button.ok=Ok
button.cancel=Anuluj
menu.label.recipes=Przepisy
menu.label.ingredients=Składniki
menu.label.preparation=Przygotowanie
menu.button.add.recipe=Dodaj przepis
menu.button.add.ingredient=Dodaj składnik
menu.button.add.step=Dodaj instrukcjÄ™
menu.button.add.step=Dodaj krok
menu.button.favourites=Ulubione
menu.button.ingredients=SkÅadniki
menu.button.remove.recipe=Usuń przepis
menu.button.remove.ingredient=Usuń składnik
menu.button.remove.step=Usuń instrukcję
menu.button.remove.step=Usuń krok
menu.button.edit=Edytuj
menu.button.clone=Duplikuj
menu.button.print=Drukuj przepis
menu.ingredients.title=wartoÅci odżywcze
menu.ingredients.title=Wartość odżywcza
menu.button.add=Dodaj
menu.button.refresh=Odśwież
menu.button.delete=Usuń
menu.button.close=Zamknij
app.word.recipe.n=Przepisy
app.updated=Zaktualizowano właśnie
app.estimated=Szacowane:
app.prompt.something-new=Coś nowego...
app.prompt.new-ingredient=Nowy składnik...
app.prompt.select-ingredient=Wybierz składnik
app.kcal=Szacowana wartość energetyczna:
app.label.usage.part=Używany w
app.list=Lista zakupów
app.title.addoverview=Sprawdź składniki przed dodaniem
app.label.inferred-kcal=Wywnioskowane kalorie dla tego przepisu:
app.label.inferred-size=Wywnioskowany rozmiar porcji:
app.word.amount=Ilość
app.word.unit=Jednostka
app.word.shop=Sklep
app.word.scale=Skala
app.word.serving.n=Porcje
app.word.step.1=Krok
app.word.step.n=Kroki
app.word.ingredient=Składnik
app.word.ingredient.n=Składniki
verb.cancel=Anuluj
verb.save=Zapisz
verb.delete=Usuń
verb.add=Dodaj
verb.print=Drukuj
verb.reset=Resetuj
verb.removesel=Usuń zaznaczone
verb.addconfirm=Potwierdź i dodaj
menu.search=Szukaj...
menu.label.selected-langs=Języki
menu.shopping.title=Lista zakupów
menu.nutrition.carbs=W?glowodany
menu.nutrition.protein=Bia?ka
menu.nutrition.fat=T?uszcze
menu.nutrition.carbs=Węglowodany
menu.nutrition.protein=Białko
menu.nutrition.fat=Tłuszcze
lang.en.display=Inglisz
lang.nl.display=Holenderski

View file

@ -1,52 +1,60 @@
add.ingredient.title=kipisi moku sin
add.recipe.title=lipu moku sin
add.step.title=nasin sin pi pali moku
add.ingredient.label=kipisi moku
add.recipe.label=nimi pi lipu moku
add.step.label=nasin pi pali moku
button.ok=pona
button.cancel=o pini
menu.label.recipes=lipu moku
menu.label.ingredients=kipisi pi moku ni
menu.label.preparation=nasin pi pali moku ni
menu.button.add.recipe=o pali e lipu moku sin
menu.button.add.ingredient=o pali e kipisi moku sin
menu.button.add.step=o pali e nasin pi pali moku ni
menu.button.favourites=ijo pi pona mute tawa sina
menu.button.ingredients=kipisi moku mute
menu.button.remove.recipe=o weka e lipu moku ni
menu.button.remove.ingredient=o weka e kipisi moku ni
menu.button.remove.step=o weka e nasin pi pali moku ni
menu.label.ingredients=kipisi moku
menu.label.preparation=pali moku
menu.button.add.recipe=o pali lipu moku
menu.button.add.ingredient=o pali kipisi moku
menu.button.add.step=o pali nasin
menu.button.favourites=pilin pona
menu.button.remove.recipe=weka lipu moku
menu.button.remove.ingredient=weka kipisi moku
menu.button.remove.step=weka nasin
menu.button.edit=o pali
menu.button.clone=o sama
menu.button.print=o tawa lon lipu
menu.ingredients.title=nanpa moku
menu.button.print=o tawa lipu
menu.ingredients.title=kipisi moku ale
menu.button.add=o pali
menu.button.refresh=o pali sin
menu.button.delete=o weka
menu.button.refresh=o sin
menu.button.close=o pini
app.word.recipe.n=lipu moku
app.updated=sin lon tenpo pini
app.estimated=nanpa isipin:
app.prompt.something-new=ijo sin...
app.prompt.new-ingredient=kipisi moku sin...
app.prompt.select-ingredient=o wile e kipisi moku
app.kcal=nanpa moku:
app.label.usage.part=kepeken lon
app.list=lipu esun pali moku
app.title.addoverview=o lukin e kipisi moku la tenpo kama pali
app.label.inferred-kcal=nanpa moku tan lipu moku ni:
app.label.inferred-size=suli tawa jan wan:
app.word.amount=nanpa
app.word.unit=kulupu
app.word.shop=ma pi tomo esun
app.word.scale=suli
app.word.serving.n=suli moku
app.word.step.1=nasin
app.word.step.n=nasin
app.word.ingredient=kipisi moku
app.word.ingredient.n=kipisi moku
menu.search=o alasa
menu.label.selected-langs=toki wile
menu.shopping.title=ijo wile mani mute
verb.cancel=o pini
verb.save=pona
verb.delete=o weka
verb.add=o pali
verb.print=o tawa lipu
verb.reset=o ante sin
verb.removesel=o weka ni
verb.addconfirm=pona
menu.search=o alasa...
menu.nutrition.carbs=kipisi moku suwi
menu.nutrition.protein=kipisi moku walo
menu.nutrition.fat=kipisi moku suli
menu.label.selected-langs=toki wile:
lang.en.display=toki Inli
lang.nl.display=toki Netelan
lang.pl.display=toki Posuka
lang.tok.display=toki pona
lang.tr.display=toki Tuki
lang.zht.display=toki Sonko (tan pi tenpo pini)
lang.zhc.display=toki Sonko (tan pi tenpo ni)
lang.zht.display=toki Sonko (tan pi tenpo pini)

View file

@ -1,48 +1,80 @@
add.ingredient.title=Malzeme Ekle
add.recipe.title=Tarif Olu\u015Ftur
add.step.title=Ad\u0131m Ekle
add.ingredient.label=Malzeme
add.recipe.label=Tarif Ad\u0131
add.step.label=Ad\u0131m
button.ok=Tamam
button.cancel=\u0130ptal
menu.label.recipes=Tarifler
menu.label.ingredients=Malzemeler
menu.label.preparation=Haz\u0131rl\u0131k
menu.label.preparation=Hazırlık
menu.button.add.recipe=Tarif Ekle
menu.button.add.ingredient=Malzeme Ekle
menu.button.add.step=Ad\u0131m Ekle
menu.button.add.recipe=Tarif ekle
menu.button.add.ingredient=Malzeme ekle
menu.button.add.step=Adım ekle
menu.button.favourites=Favoriler
menu.button.ingredients=Malzemeler
menu.button.remove.recipe=Tarifi Sil
menu.button.remove.ingredient=Malzemeyi Sil
menu.button.remove.step=Ad\u0131m\u0131 Sil
menu.button.edit=D\u00FCzenle
menu.button.remove.recipe=Tarifi kaldır
menu.button.remove.ingredient=Malzemeyi kaldır
menu.button.remove.step=Adımı kaldır
menu.button.edit=Düzenle
menu.button.clone=Kopyala
menu.button.print=Tarifi Yazd\u0131r
menu.button.print=Tarifi yazdır
menu.ingredients.title=Besin değeri
menu.ingredients.title=besin değerleri
menu.button.add=Ekle
menu.button.refresh=yenilemek
menu.button.delete=sil
menu.button.close=kapat
menu.button.refresh=Yenile
menu.button.close=Kapat
app.word.recipe.n=Tarifler
app.updated=Az önce güncellendi
app.estimated=Tahmini:
app.prompt.something-new=Yeni bir şey...
app.prompt.new-ingredient=Yeni malzeme...
app.prompt.select-ingredient=Malzemeyi seçin
app.kcal=Tahmini enerji değeri:
app.label.usage.part=Kullanıldığı yer
app.list=Alışveriş Listesi
app.title.addoverview=Eklemeden önce malzemeleri gözden geçirin
app.label.inferred-kcal=Bu tarif için çıkarılan kalori:
app.label.inferred-size=Çıkarılan porsiyon boyutu:
app.word.amount=Miktar
app.word.unit=Birim
app.word.shop=Mağaza
app.word.scale=Ölçek
app.word.serving.n=Porsiyonlar
app.word.step.1=Adım
app.word.step.n=Adımlar
app.word.ingredient=Malzeme
app.word.ingredient.n=Malzemeler
verb.cancel=İptal
verb.save=Kaydet
verb.delete=Sil
verb.add=Ekle
verb.print=Yazdır
verb.reset=Sıfırla
verb.removesel=Seçileni kaldır
verb.addconfirm=Onayla ve Ekle
menu.search=Ara...
menu.search=Arama...
menu.label.selected-langs=Diller
menu.shopping.title=Al??veri? listesi
menu.shopping.title=alışveriş listesi
menu.nutrition.carbs=Karbonhidratlar
menu.nutrition.protein=Protein
menu.nutrition.fat=Ya?
menu.nutrition.fat=yağ
lang.en.display=English
lang.nl.display=Nederlands

View file

@ -1,37 +1,78 @@
add.ingredient.title=添加配料
add.recipe.title=创建食谱
add.step.title=添加步骤
add.ingredient.label=配料
add.recipe.label=食谱名称
add.step.label=步骤
button.ok=确认
button.cancel=取消
menu.label.recipes=食谱
menu.label.ingredients=配料
menu.label.preparation=准备步骤
menu.label.preparation=准备
menu.button.add.recipe=创建食谱
menu.button.add.ingredient=添加配料
menu.button.add.recipe=添加食谱
menu.button.add.ingredient=添加食材
menu.button.add.step=添加步骤
menu.button.favourites=收藏
menu.button.remove.recipe=删除食谱
menu.button.remove.ingredient=删除食材
menu.button.remove.step=删除步骤
menu.button.remove.recipe=清除食谱
menu.button.remove.ingredient=清除配料
menu.button.remove.step=清除步骤
menu.button.edit=编辑
menu.button.clone=复制
menu.button.clone=克隆
menu.button.print=打印食谱
menu.search=搜索
menu.ingredients.title=营养价值
menu.button.add=添加
menu.button.refresh=刷新
menu.button.close=关闭
app.word.recipe.n=食谱
app.updated=刚刚更新
app.estimated=估计:
app.prompt.something-new=新的食材...
app.prompt.new-ingredient=新的食材...
app.prompt.select-ingredient=选择你的食材
app.kcal=估计能量值:
app.label.usage.part=用于
app.list=购物清单
app.title.addoverview=在添加前检查食材
app.label.inferred-kcal=此食谱推断的卡路里:
app.label.inferred-size=推断的份量大小:
app.word.amount=数量
app.word.unit=单位
app.word.shop=商店
app.word.scale=比例
app.word.serving.n=份数
app.word.step.1=步骤
app.word.step.n=步骤
app.word.ingredient=食材
app.word.ingredient.n=食材
verb.cancel=取消
verb.save=保存
verb.delete=删除
verb.add=添加
verb.print=打印
verb.reset=重置
verb.removesel=删除所选
verb.addconfirm=确认并添加
menu.search=搜索...
menu.label.selected-langs=语言
menu.nutrition.carbs=?????
menu.nutrition.protein=???
menu.nutrition.fat=??
menu.nutrition.carbs=碳水化合物
menu.nutrition.protein=蛋白质
menu.nutrition.fat=脂肪
lang.en.display=English
lang.nl.display=Nederlands

View file

@ -1,37 +1,78 @@
add.ingredient.title=添加配料
add.recipe.title=創建食譜
add.step.title=添加步驟
add.ingredient.label=配料
add.recipe.label=食譜名稱
add.step.label=步驟
button.ok=確認
button.cancel=取消
menu.label.recipes=食譜
menu.label.ingredients=配料
menu.label.preparation=制備步驟
menu.label.preparation=準備
menu.button.add.recipe=創建食譜
menu.button.add.ingredient=添加配料
menu.button.add.step=添加步驟
menu.button.remove.recipe=清除食譜
menu.button.remove.ingredient=清除配料
menu.button.remove.step=清除步驟
menu.button.add.recipe=新增食譜
menu.button.add.ingredient=新增食材
menu.button.add.step=新增步驟
menu.button.favourites=收藏
menu.button.remove.recipe=刪除食譜
menu.button.remove.ingredient=刪除食材
menu.button.remove.step=刪除步驟
menu.button.edit=編輯
menu.button.clone=複製
menu.button.print=列印食譜
menu.search=搜索
menu.ingredients.title=營養價值
menu.button.add=新增
menu.button.refresh=重新整理
menu.button.close=關閉
app.word.recipe.n=食譜
app.updated=剛剛更新
app.estimated=估計:
app.prompt.something-new=發現新事物...
app.prompt.new-ingredient=新的食材...
app.prompt.select-ingredient=選擇你的食材
app.kcal=估計能量值:
app.label.usage.part=使用於
app.list=購物清單
app.title.addoverview=在加入前檢查食材
app.label.inferred-kcal=此食譜推斷的卡路里:
app.label.inferred-size=推斷的份量大小:
app.word.amount=數量
app.word.unit=單位
app.word.shop=商店
app.word.scale=比例
app.word.serving.n=份數
app.word.step.1=步驟
app.word.step.n=步驟
app.word.ingredient=食材
app.word.ingredient.n=食材
verb.cancel=取消
verb.save=儲存
verb.delete=刪除
verb.add=新增
verb.print=列印
verb.reset=重設
verb.removesel=刪除所選
verb.addconfirm=確認並新增
menu.search=搜尋...
menu.label.selected-langs=語言
menu.nutrition.carbs=?????
menu.nutrition.protein=???
menu.nutrition.fat=??
menu.nutrition.carbs=碳水化合物
menu.nutrition.protein=蛋白質
menu.nutrition.fat=油脂
lang.en.display=English
lang.nl.display=Nederlands