fix(color): Move mdls not in models.yml to /Models/Unused (#2397)

* Move models.yml that don't exist into /Models/Unused

* Add sdMove, Translations, move both models.yml

* Comments, break loop, rmv extra bool.

* Show Press_Any_Key on dialog

* Translations

* Always create /Models/UNUSED if models.yml exists.

* Close directories
This commit is contained in:
Cliff
2022-10-01 11:29:16 +10:00
committed by GitHub
parent c19f7eafd4
commit 5b6fac36c6
21 changed files with 327 additions and 40 deletions
+37
View File
@@ -416,6 +416,43 @@ const char * sdCopyFile(const char * srcFilename, const char * srcDir, const cha
return sdCopyFile(srcPath, destPath);
}
// Will overwrite if destination exists
const char * sdMoveFile(const char * srcPath, const char * destPath)
{
const char *result;
result = sdCopyFile(srcPath, destPath);
if(result != 0) {
return result;
}
FRESULT fres = f_unlink(srcPath);
if(fres != FR_OK) {
return SDCARD_ERROR(fres);
}
return nullptr;
}
// Will overwrite if destination exists
const char * sdMoveFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir)
{
const char *result;
result = sdCopyFile(srcFilename, srcDir, destFilename, destDir);
if(result != 0) {
return result;
}
char srcPath[2*CLIPBOARD_PATH_LEN+1];
char * tmp = strAppend(srcPath, srcDir, CLIPBOARD_PATH_LEN);
*tmp++ = '/';
strAppend(tmp, srcFilename, CLIPBOARD_PATH_LEN);
FRESULT fres = f_unlink(srcPath);
if(fres != FR_OK) {
return SDCARD_ERROR(fres);
}
return nullptr;
}
#endif // defined(SDCARD)
+3
View File
@@ -35,6 +35,7 @@ extern FIL g_oLogFile;
#define ROOT_PATH PATH_SEPARATOR
#define MODELS_PATH ROOT_PATH "MODELS" // no trailing slash = important
#define DELETED_MODELS_PATH MODELS_PATH PATH_SEPARATOR "DELETED"
#define UNUSED_MODELS_PATH MODELS_PATH PATH_SEPARATOR "UNUSED"
#define RADIO_PATH ROOT_PATH "RADIO" // no trailing slash = important
#define TEMPLATES_PATH ROOT_PATH "TEMPLATES"
#define PERS_TEMPL_PATH TEMPLATES_PATH "/PERSONAL"
@@ -191,6 +192,8 @@ unsigned int findNextFileIndex(char * filename, uint8_t size, const char * direc
const char * sdCopyFile(const char * src, const char * dest);
const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir);
const char * sdMoveFile(const char * src, const char * dest);
const char * sdMoveFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir);
#define LIST_NONE_SD_FILE 1
#define LIST_SD_FILE_EXT 2
+86 -15
View File
@@ -30,6 +30,7 @@ using std::list;
#include "storage/sdcard_yaml.h"
#include "yaml/yaml_datastructs.h"
#include "yaml/yaml_labelslist.h"
#include "yaml/yaml_modelslist.h"
#include "yaml/yaml_parser.h"
#endif
@@ -1024,6 +1025,84 @@ bool ModelsList::loadYaml()
f_closedir(&moddir);
}
// Check if models.yml exists
// Any files found above that are not listed in the file will be moved into
// /MDOELS/UNUSED and removed from the discovered file hash list
char line[LEN_MODELS_IDX_LINE + 1];
FILINFO fno;
FRESULT result;
bool foundInModels = f_stat(MODELSLIST_YAML_PATH, &fno) == FR_OK;
bool foundInRadio = f_stat(FALLBACK_MODELSLIST_YAML_PATH, &fno) == FR_OK;
if(foundInModels) { // Default to /Models copy
result = f_open(&file, MODELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ);
} else if (foundInRadio) {
result = f_open(&file, FALLBACK_MODELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ);
}
if((foundInModels || foundInRadio) && result == FR_OK) {
// Create /Models/Unused if it doesn't exist
bool moveRequired = false;
DIR unusedFolder;
FRESULT result = f_opendir(&unusedFolder, UNUSED_MODELS_PATH);
if (result != FR_OK) {
if (result == FR_NO_PATH) result = f_mkdir(UNUSED_MODELS_PATH);
if (result != FR_OK) {
TRACE("Unable to create unused models folder");
return false;
}
} else f_closedir(&unusedFolder);
YamlParser ymp;
std::vector<std::string> modfiles;
void *ctx = get_modelslist_iter(&modfiles);
ymp.init(get_modelslist_parser_calls(), ctx);
UINT bytes_read = 0;
while (f_read(&file, line, sizeof(line), &bytes_read) == FR_OK) {
if (bytes_read == 0) break;
if (f_eof(&file)) ymp.set_eof();
if (ymp.parse(line, bytes_read) != YamlParser::CONTINUE_PARSING) break;
}
f_close(&file);
// Loop through file hases, move any files found that don't exists to /unused
std::vector<filedat> newFileHash;
for(const auto &fhas: fileHashInfo) {
bool found = false;
for(const auto &file : modfiles) {
if (file == fhas.name) {
TRACE_LABELS("Found file %s in models.yml.. OK!", file);
found = true;
break;
}
}
if(!found) {
moveRequired = true;
TRACE_LABELS("Model %s not in models.yml, moving to /UNUSED", fhas.name.c_str());
// Move model into unused folder.
const char *warning = sdMoveFile(fhas.name.c_str(), MODELS_PATH, fhas.name.c_str(), UNUSED_MODELS_PATH);
if(warning)
POPUP_WARNING(warning);
} else {
newFileHash.push_back(fhas); // File exists, keep it
}
}
if(foundInRadio) {
const char *warning = sdMoveFile(MODELS_FILENAME, RADIO_PATH, MODELS_FILENAME, UNUSED_MODELS_PATH);
if(warning)
POPUP_WARNING(warning);
}
if(foundInModels) { // Will overwrite the copy from /radio if both existed, do last
const char *warning = sdMoveFile(MODELS_FILENAME, MODELS_PATH, MODELS_FILENAME, UNUSED_MODELS_PATH);
if(warning)
POPUP_WARNING(warning);
}
if(moveRequired) {
fileHashInfo = newFileHash; // Update the new file list
POPUP_WARNING(TR_MODELS_MOVED "\n" UNUSED_MODELS_PATH, "\n" TR_PRESS_ANY_KEY_TO_SKIP);
}
}
#if defined(DEBUG_TIMERS)
DEBUG_TIMER_SAMPLE(debugTimerYamlScan);
TRACE("Lables: Time to scan models folder %luus",
@@ -1031,9 +1110,7 @@ bool ModelsList::loadYaml()
#endif
// Scan labels.yml
char line[LEN_MODELS_IDX_LINE + 1];
FRESULT result =
f_open(&file, LABELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ);
result = f_open(&file, LABELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ);
if (result == FR_OK) {
YamlParser yp;
void *ctx = get_labelslist_iter();
@@ -1340,21 +1417,15 @@ bool ModelsList::removeModel(ModelCell *model)
TRACE("Unable to create deleted models folder");
return true;
}
}
} else f_closedir(&deletedFolder);
// Move model into deleted folder. If not moved will be re-added on next
// reboot
if (!sdCopyFile(model->modelFilename, MODELS_PATH, model->modelFilename,
DELETED_MODELS_PATH)) {
char curFilename[sizeof(MODELS_PATH) + LEN_MODEL_FILENAME + 2] = "";
strcat(curFilename, MODELS_PATH PATH_SEPARATOR);
strcat(curFilename, model->modelFilename);
TRACE_LABELS("Deleting Model %s", model->modelFilename);
if (f_unlink(curFilename) != FR_OK) {
TRACE("Labels: Unable to delete file");
return true;
}
TRACE_LABELS("Deleting Model %s", model->modelFilename);
const char *warning = sdMoveFile(model->modelFilename, MODELS_PATH, model->modelFilename, DELETED_MODELS_PATH);
if (warning) {
TRACE("Labels: Unable to move file");
return true;
}
// Free memory
+1
View File
@@ -7,6 +7,7 @@ set(SRC ${SRC} storage/yaml/yaml_tree_walker.cpp
if(STORAGE_MODELSLIST)
set(SRC ${SRC} storage/yaml/yaml_labelslist.cpp)
set(SRC ${SRC} storage/yaml/yaml_modelslist.cpp)
add_definitions(-DSTORAGE_MODELSLIST)
endif()
+127
View File
@@ -0,0 +1,127 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "yaml_modelslist.h"
#include "yaml_parser.h"
#include "storage/modelslist.h"
#include <cstring>
using std::list;
struct modelslist_iter
{
enum Level {
Root=0,
Category=1,
Model=2
};
std::vector<std::string>* filelist;
uint8_t level;
char current_attr[16]; // set after find_node()
};
static modelslist_iter __modelslist_iter_inst;
void* get_modelslist_iter(std::vector<std::string>* filelist)
{
__modelslist_iter_inst.filelist = filelist;
__modelslist_iter_inst.level = 0;
return &__modelslist_iter_inst;
}
static bool to_parent(void* ctx)
{
modelslist_iter* mi = (modelslist_iter*)ctx;
if (mi->level == modelslist_iter::Root) {
return false;
}
mi->level--;
return true;
}
static bool to_child(void* ctx)
{
modelslist_iter* mi = (modelslist_iter*)ctx;
if (mi->level == modelslist_iter::Model) {
return false;
}
mi->level++;
return true;
}
static bool to_next_elmt(void* ctx)
{
modelslist_iter* mi = (modelslist_iter*)ctx;
if (mi->level == modelslist_iter::Root) {
return false;
}
return true;
}
static bool find_node(void* ctx, char* buf, uint8_t len)
{
modelslist_iter* mi = (modelslist_iter*)ctx;
if (len > sizeof(modelslist_iter::current_attr)-1)
len = sizeof(modelslist_iter::current_attr)-1;
memcpy(mi->current_attr, buf, len);
mi->current_attr[len] = '\0';
return true;
}
static void set_attr(void* ctx, char* buf, uint8_t len)
{
char fnamebuf[LEN_MODEL_FILENAME + 1];
modelslist_iter* mi = (modelslist_iter*)ctx;
switch (mi->level) {
case modelslist_iter::Model:
if (!strcmp(mi->current_attr, "filename")) {
if(len <= LEN_MODEL_FILENAME) {
memcpy(fnamebuf, buf, len);
fnamebuf[len] = '\0';
mi->filelist->push_back(fnamebuf);
}
}
break;
}
}
static const YamlParserCalls modelslistCalls = {
to_parent,
to_child,
to_next_elmt,
find_node,
set_attr
};
const YamlParserCalls* get_modelslist_parser_calls()
{
return &modelslistCalls;
}
+33
View File
@@ -0,0 +1,33 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _YAML_MODELSLIST_H_
#define _YAML_MODELSLIST_H_
#include <vector>
#include <string>
struct YamlParserCalls;
void* get_modelslist_iter(std::vector<std::string>* filelist);
const YamlParserCalls* get_modelslist_parser_calls();
#endif
+1
View File
@@ -340,6 +340,7 @@ const char STR_MODELS[] = TR_MODELS;
const char STR_SELECT_MODE[] = TR_SELECT_MODE;
const char STR_CREATE_MODEL[] = TR_CREATE_MODEL;
const char STR_FAVORITE_LABEL[] = TR_FAVORITE_LABEL;
const char STR_MODELS_MOVED[] = TR_MODELS_MOVED;
const char STR_NEW_MODEL[] = TR_NEW_MODEL;
const char STR_INVALID_MODEL[] = TR_INVALID_MODEL;
const char STR_EDIT_LABELS[] = TR_EDIT_LABELS;
+2 -1
View File
@@ -9,7 +9,7 @@
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
@@ -539,6 +539,7 @@ extern const char STR_MODELS[];
extern const char STR_SELECT_MODE[];
extern const char STR_CREATE_MODEL[];
extern const char STR_FAVORITE_LABEL[];
extern const char STR_MODELS_MOVED[];
extern const char STR_NEW_MODEL[];
extern const char STR_INVALID_MODEL[];
extern const char STR_EDIT_LABELS[];
+4 -3
View File
@@ -633,6 +633,7 @@
#define TR_SELECT_MODE "选择模式"
#define TR_CREATE_MODEL "创建模型"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
@@ -806,7 +807,7 @@
#define TR_PATH_TOO_LONG "路径太长"
#define TR_VIEW_TEXT "查看文本"
#define TR_FLASH_BOOTLOADER "更新引导程序"
#define TR_FLASH_DEVICE TR("更新设备","更新设备")
#define TR_FLASH_DEVICE TR("更新设备","更新设备")
#define TR_FLASH_EXTERNAL_DEVICE TR("从S.Port更新", "从 S.Port 端口更新外设固件")
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Flash RX by ext. OTA"
@@ -1309,9 +1310,9 @@
#define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "将所有微调导入中点偏移值"
#if LCD_W > LCD_H
#define TR_OPEN_CHANNEL_MONITORS "打开通道监视器"
#define TR_OPEN_CHANNEL_MONITORS "打开通道监视器"
#else
#define TR_OPEN_CHANNEL_MONITORS "通道监视"
#define TR_OPEN_CHANNEL_MONITORS "通道监视"
#endif
#define TR_DUPLICATE "复制"
#define TR_ACTIVATE "启用"
+1
View File
@@ -649,6 +649,7 @@
#define TR_SELECT_MODE "Vybrat mód"
#define TR_CREATE_MODEL "Nový model"
#define TR_FAVORITE_LABEL "Oblíbené"
#define TR_MODELS_MOVED "Nepoužívané modely přesunuty do"
#define TR_NEW_MODEL "Nový model"
#define TR_INVALID_MODEL "Neplatný model"
#define TR_EDIT_LABELS "Upravit štítek"
+5 -4
View File
@@ -29,7 +29,7 @@
* \001 to \034 -extended spacing (value * FW/2)
* \0 -ends current string
*/
#define TR_OFFON "FRA","TIL"
#define TR_MMMINV "---","INV"
#define TR_VBEEPMODE "Stille","Alarm","NoKey","Alle"
@@ -633,6 +633,7 @@
#define TR_SELECT_MODE "Vælg tilstand"
#define TR_CREATE_MODEL "Opret model"
#define TR_FAVORITE_LABEL "Favoritter"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "Ny model"
#define TR_INVALID_MODEL "Ingen billede"
#define TR_EDIT_LABELS "Ret type"
@@ -806,7 +807,7 @@
#define TR_PATH_TOO_LONG "Sti for lang"
#define TR_VIEW_TEXT "Vis tekst"
#define TR_FLASH_BOOTLOADER "Brænde bootloader"
#define TR_FLASH_DEVICE TR("Brænde enhed","Brænde enhed")
#define TR_FLASH_DEVICE TR("Brænde enhed","Brænde enhed")
#define TR_FLASH_EXTERNAL_DEVICE TR("Brænde S.Port", "Brænde S.Port enhed")
#define TR_FLASH_RECEIVER_OTA "Brænde modtager OTA"
#define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Brænde RX med ext. OTA"
@@ -1309,9 +1310,9 @@
#define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Tillæg alle trim til subtrim"
#if LCD_W > LCD_H
#define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Monitor"
#define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Monitor"
#else
#define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Mon."
#define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Mon."
#endif
#define TR_DUPLICATE "Dupliker"
#define TR_ACTIVATE "Set aktiv"
+1
View File
@@ -632,6 +632,7 @@
#define TR_SELECT_MODE "Wähle Mode"
#define TR_CREATE_MODEL TR("Neues Modell" , "Neues Modell erstellen")
#define TR_FAVORITE_LABEL "Favoriten"
#define TR_MODELS_MOVED "Unbenutzte Modelle werden verschoben nach"
#define TR_NEW_MODEL "Neues Modell"
#define TR_INVALID_MODEL "ungültiges Modell"
#define TR_EDIT_LABELS "Label ändern"
+1
View File
@@ -633,6 +633,7 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Create model"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
+1
View File
@@ -634,6 +634,7 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Crear modelo"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
+5 -4
View File
@@ -179,7 +179,7 @@
#endif
#define TR_VFSWRESET TR_FSW_RESET_TIMERS,"All",TR_FSW_RESET_TELEM
#define TR_FUNCSOUNDS TR("Bp1","Beep1"),TR("Bp2","Beep2"),TR("Bp3","Beep3"),TR("Wrn1","Warn1"),TR("Wrn2","Warn2"),TR("Chee","Cheep"),TR("Rata","Ratata"),"Tick",TR("Sirn","Siren"),"Ring",TR("SciF","SciFi"),TR("Robt","Robot"),TR("Chrp","Chirp"),"Tada",TR("Crck","Crickt"),TR("Alrm","AlmClk")
#define TR_TELEM_RESERVE TR("[--]","[---]")
@@ -648,6 +648,7 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Create Model"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
@@ -820,7 +821,7 @@
#define TR_PATH_TOO_LONG "Polku liian pitkä"
#define TR_VIEW_TEXT "View text"
#define TR_FLASH_BOOTLOADER "Flash bootloader"
#define TR_FLASH_DEVICE TR("Flash device","Flash device")
#define TR_FLASH_DEVICE TR("Flash device","Flash device")
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Flash RX by ext. OTA"
@@ -1331,9 +1332,9 @@
#define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Add all Trims to Subtrims"
#if LCD_W > LCD_H
#define TR_OPEN_CHANNEL_MONITORS "Open Channel Monitor"
#define TR_OPEN_CHANNEL_MONITORS "Open Channel Monitor"
#else
#define TR_OPEN_CHANNEL_MONITORS "Open Channel Mon."
#define TR_OPEN_CHANNEL_MONITORS "Open Channel Mon."
#endif
#define TR_DUPLICATE "Duplicate"
+1
View File
@@ -653,6 +653,7 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Créer modèle"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
+1
View File
@@ -634,6 +634,7 @@
#define TR_SELECT_MODE "Seleziona modo"
#define TR_CREATE_MODEL "Crea Modello"
#define TR_FAVORITE_LABEL "Favoriti"
#define TR_MODELS_MOVED "Modelli inutilizzati spostati in"
#define TR_NEW_MODEL "Nuovo Modello"
#define TR_INVALID_MODEL "Modello invalido"
#define TR_EDIT_LABELS "Edita Etichette"
+4 -3
View File
@@ -639,11 +639,12 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Nieuw Model"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
#define TR_MOVE_UP "Move Up"
#define TR_MOVE_DOWN "Move Down"
#define TR_MOVE_UP "Move Up"
#define TR_MOVE_DOWN "Move Down"
#define TR_ENTER_LABEL "Enter Label"
#define TR_LABEL "Label"
#define TR_LABELS "Labels"
+4 -3
View File
@@ -630,11 +630,12 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Nowy model"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
#define TR_MOVE_UP "Move Up"
#define TR_MOVE_DOWN "Move Down"
#define TR_MOVE_UP "Move Up"
#define TR_MOVE_DOWN "Move Down"
#define TR_ENTER_LABEL "Enter Label"
#define TR_LABEL "Label"
#define TR_LABELS "Labels"
+4 -3
View File
@@ -636,11 +636,12 @@
#define TR_SELECT_MODE "Select mode"
#define TR_CREATE_MODEL "Criar Modelo"
#define TR_FAVORITE_LABEL "Favorites"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "New Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_INVALID_MODEL "Invalid Model"
#define TR_EDIT_LABELS "Edit Labels"
#define TR_MOVE_UP "Move Up"
#define TR_MOVE_DOWN "Move Down"
#define TR_MOVE_UP "Move Up"
#define TR_MOVE_DOWN "Move Down"
#define TR_ENTER_LABEL "Enter Label"
#define TR_LABEL "Label"
#define TR_LABELS "Labels"
+5 -4
View File
@@ -78,7 +78,7 @@
#else
#define TR_RETA123 "R","H","G","S","1","2","3"
#endif
#define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|"
#define TR_VMLTPX "Addera","Förstärk","Ersätt"
#define TR_VMLTPX2 "+=","*=",":="
@@ -673,6 +673,7 @@
#define TR_SELECT_MODE "Välj läge"
#define TR_CREATE_MODEL "Skapa modell"
#define TR_FAVORITE_LABEL "Favoriter"
#define TR_MODELS_MOVED "Unused models moved to"
#define TR_NEW_MODEL "Ny modell"
#define TR_INVALID_MODEL "Ogiltig modell"
#define TR_EDIT_LABELS "Redigera etiketter"
@@ -981,7 +982,7 @@
#define TR_ENABLE "Aktivera"
#define TR_TOPLCDTIMER "Översta LCD timer"
#define TR_UNIT "Enhet"
#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till..."
#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till..."
#define TR_CHANNELRANGE TR(INDENT "Kanalomr.", INDENT "Kanalområde")
#define TR_RXFREQUENCY TR("RX frekv.", "RX frekvens")
#define TR_AFHDS3_RX_FREQ TR("RX frekv", "RX frekvens")
@@ -1373,9 +1374,9 @@
#define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Addera alla trimmar till subtrimmar"
#if LCD_W > LCD_H
#define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmonitorn"
#define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmonitorn"
#else
#define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmon."
#define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmon."
#endif
#define TR_DUPLICATE "Duplicera"