pull/833/head
Diman4os 2018-05-06 12:00:02 +03:00
parent edbe14dff6
commit ed6614b136
18 changed files with 93 additions and 47 deletions

View File

@ -4,3 +4,5 @@ development:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
test:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
production:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3

View File

@ -518,6 +518,22 @@ ActiveRecord::Schema.define(version: 20180423202520) do
add_foreign_key "sensors", "devices"
add_foreign_key "token_issuances", "devices"
create_view "in_use_points", sql_definition: <<-SQL
SELECT points.x,
points.y,
points.z,
(edge_nodes.value)::integer AS point_id,
points.pointer_type,
points.name AS pointer_name,
sequences.id AS sequence_id,
sequences.name AS sequence_name,
edge_nodes.id AS edge_node_id
FROM ((edge_nodes
JOIN sequences ON ((edge_nodes.sequence_id = sequences.id)))
JOIN points ON (((edge_nodes.value)::integer = points.id)))
WHERE ((edge_nodes.kind)::text = 'pointer_id'::text);
SQL
create_view "in_use_tools", sql_definition: <<-SQL
SELECT tools.id AS tool_id,
tools.name AS tool_name,
@ -530,23 +546,6 @@ ActiveRecord::Schema.define(version: 20180423202520) do
WHERE ((edge_nodes.kind)::text = 'tool_id'::text);
SQL
create_view "in_use_points", sql_definition: <<-SQL
SELECT points.x,
points.y,
points.z,
sequences.id AS sequence_id,
edge_nodes.id AS edge_node_id,
points.device_id,
(edge_nodes.value)::integer AS point_id,
points.pointer_type,
points.name AS pointer_name,
sequences.name AS sequence_name
FROM ((edge_nodes
JOIN sequences ON ((edge_nodes.sequence_id = sequences.id)))
JOIN points ON (((edge_nodes.value)::integer = points.id)))
WHERE ((edge_nodes.kind)::text = 'pointer_id'::text);
SQL
create_view "sequence_usage_reports", sql_definition: <<-SQL
SELECT sequences.id AS sequence_id,
( SELECT count(*) AS count

View File

@ -93,7 +93,7 @@
"webpack-uglify-js-plugin": "1.1.9",
"weinre": "^2.0.0-pre-I0Z7U9OV",
"which": "^1.3.0",
"yarn": "^1.5.1"
"yarn": "^1.6.0"
},
"devDependencies": {
"jscpd": "^0.6.15",

View File

@ -1,4 +1,44 @@
module.exports = {
"submit":"подтвердить",
"Server":"Сервер",
"Change the account FarmBot is connected to.":"Сменить аккаунт, к которому подключен этот робот.",
"Change Ownership":"Смена владельца",
"Display a virtual trail for FarmBot in the Farm Designer map to show movement and watering history while the map is open. Toggling this setting will clear data for the current trail.":" Отображение виртуального пройденного маршрута робота в окне дизайнера грядки позволяет просматривать историю перемещений и обработки. Переключение этого параметра очистит отображаемый пройденный маршрут.",
"Don't ask about saving work before closing browser tab. Warning: may cause loss of data.":"Не выводить напоминание о сохранении данных при закрытии вкладки браузера. Внимание: это может привести к потере данных.",
"Display virtual FarmBot trail":"Отображать виртуальный маршрут робота",
"Discard Unsaved Changes":"Отменять несохраненные изменения",
" copy ":" копия ",
"Are you sure you want to delete this item?":"Вы уверены, что хотите удалить этот объект?",
"Sending":"Отправка",
"weeds":"сорняков",
"Deleted {{num}} {{points}}":"Удалено {{num}} {{points}}",
"Deleting...":"Удаление...",
"UNLOCK":"сброс E-STOP",
"Sequence execution":"Выполнение функции.",
"Check for Updates":"Проверка обновлений.",
"Power Off Bot":"Отключить питание робота.",
"Reboot Bot":"Перезагрузить робота.",
"Emergency stop":"Аварийная остановка (E-STOP).",
"Emergency unlock":"Сброс Аварйной остановки (E-STOP).",
"Are you sure you want to unlock the device?":"Вы уверены, что хотите сбросить состояние аварйной остановки?",
" request sent to device.":" Запрос отправлен.",
"Homing Speed (steps/s)":"Скорость поиска домашней позиции (шагов/с)",
"Swap jog buttons":"Поменять местами кнопки управления",
"x and y axis":"Осей X и Y",
"New Sensor":"Новый датчик",
"Planned":"Запланировано",
"planned":"запланировано",
"Planted":"Посажено",
"planted":"посажено",
"Harvested":"Собрано",
"harvested":"собрано",
"The Send Message step instructs FarmBot to send a custom message to the logs (and toast message and/or email, if selected). This can help you with debugging your sequences.":"Шаг \"Отправить сообщение\" дает команду на запись произвольного сообщения в лог (или показ всплывающего сообщения или отправку email). Это бывает полезно при отладке работы функций.",
"Positions":"Координаты",
"Other":"Другое",
"Map Points":"Точки на карте",
"Map":"Карта",
"Photos are viewable from the":"Фото можно посмотреть на странице",
"page":"",
"Click a spot in the grid to choose a location. Once selected, press button to move FarmBot to this postion. Press the back arrow to exit.":"Кликните в нужное место координатной сетки. После этого, нажмите кнопку, чтобы FarmBot подъехал к указанной позиции. Кликните стрелку \"Назад\" для выхода.",
"Add sequences to your regimen by selecting a sequence from the drop down, specifying a time, choosing which days it should run on, and then clicking the + button. For example: a Seeding sequence might be scheduled for Day 1, while a Watering sequence would be scheduled to run every other day.":"Добавляйте функции в ваш режим, выбирая их из выпадающего списка, указывая время и дни, в которые они должны выполняться, после чего нажмите кнопку \"+\". Например, наметьте функцию посадки на самый первый день. Функцию полива можно назначать хоть каждый день.",
"low":"низк",
@ -71,7 +111,7 @@ module.exports = {
"CALIBRATE {{axis}}": "КАЛИБРОВАТЬ {{axis}}",
"CALIBRATION": "КАЛИБРОВКА",
"CAMERA": "Камера",
"CLEAR WEEDS": "Уборка сорняков",
"CLEAR WEEDS": "Забыть найденные сорняки",
"CLICK anywhere within the grid": "Кликните в любом месте координатной сетки",
"Calibrate": "Калибровка",
"Calibrate FarmBot's camera for use in the weed detection software.": "Калибровка камеры FarmBot-а для процесса поиска сорняков.",
@ -288,8 +328,10 @@ module.exports = {
"Note: Times displayed according to FarmBot's local time, which is currently different from your browser's time. Timezone data is configurable on the Device page).": "Примечание: временные метки соответствуют локальному времени FarmBot-а, которое в данный момент отличается от времени вашего браузера. Временную зону можно настроить на странице \"Устройство\").",
"Number of steps used for acceleration and deceleration.": "Количество шагов, за которое будет происходить ускорение и замедление. Чем оно больше, тем плавнее FarmBot будет разгоняться и замедляться.",
"Number of times to retry a movement before stopping.": "Количество попыток повторить движение перед аварийной остановкой.",
"off": "выкл",
"off": "откл",
"OFF": "Откл",
"on": "вкл",
"ON": "Вкл",
"Old Password": "Текущий пароль",
"Older than": "Старше чем",
"Operator": "Оператор",
@ -429,11 +471,11 @@ module.exports = {
"Terms of Use": "Условия использования",
"Test": "Тест",
"The Find Home step instructs the device to perform a homing command to find and set zero for the chosen axis or axes.": "Шаг \"Поиск домашней позиции\" дает роботу команду найти начало координат для выбранной оси или осей.",
"The Move Absolute step instructs FarmBot to move to the specified coordinate regardless of the current position. For example, if FarmBot is currently at X=1000, Y=1000 and it receives a Move Absolute where X=0 and Y=3000, then FarmBot will move to X=0, Y=3000. If FarmBot must move in multiple directions, it will move diagonally. If you require straight movements along one axis at a time, use multiple Move Absolute steps. Offsets allow you to more easily instruct FarmBot to move to a location, but offset from it by the specified amount. For example moving to just above where a peripheral is located. Using offsets lets FarmBot do the math for you.": "Шаг \"Абсолютное перемещение\" дает FarmBot-у команду двигаться к указанным координатам независимо от текущей позиции. Например, если FarmBot сейчас на позиции X=1000, Y=1000, и он получает эту команду с координатами X=0 and Y=3000, он переместится к координатам X=0, Y=3000. Если перемещение выполняется по нескольким координатам, робот будет двигаться по диагонали. Если вам нужно, чтобы он двигался сначала по одной координате, а потом по другой - используйте несколько шагов \"Абсолютное перемещение\". Offsets allow you to more easily instruct FarmBot to move to a location, but offset from it by the specified amount. Например, подъехать на позицию, расположенную выше насадки. Использование смещений позволяет FarmBot-у посчитать всю математику за вас.",
"The Move Absolute step instructs FarmBot to move to the specified coordinate regardless of the current position. For example, if FarmBot is currently at X=1000, Y=1000 and it receives a Move Absolute where X=0 and Y=3000, then FarmBot will move to X=0, Y=3000. If FarmBot must move in multiple directions, it will move diagonally. If you require straight movements along one axis at a time, use multiple Move Absolute steps. Offsets allow you to more easily instruct FarmBot to move to a location, but offset from it by the specified amount. For example moving to just above where a peripheral is located. Using offsets lets FarmBot do the math for you.": "Шаг \"Абсолютное перемещение\" дает FarmBot-у команду двигаться к указанным координатам независимо от текущей позиции. Например, если FarmBot сейчас на позиции X=1000, Y=1000, и он получает эту команду с координатами X=0 and Y=3000, он переместится к координатам X=0, Y=3000. Если перемещение выполняется по нескольким координатам, робот будет двигаться по диагонали. Если вам нужно, чтобы он двигался сначала по одной координате, а потом по другой - используйте несколько шагов \"Абсолютное перемещение\". Настройка сдвигов позволяет дать команду FarmBot-у подъехать к выбранной координате, но со смещением по нужной оси. Например, подъехать на позицию, расположенную выше насадки. Использование смещений позволяет FarmBot-у посчитать всю математику за вас.",
"The Move Relative step instructs FarmBot to move the specified distance from its current location. For example, if FarmBot is currently at X=1000, Y=1000 and it receives a Move Relative where X=0 and Y=3000, then FarmBot will move to X=1000, Y=4000. If FarmBot must move in multiple directions, it will move diagonally. If you require straight movements along one axis at a time, use multiple Move Relative steps. Move Relative steps should be preceded by a Move Absolute step to ensure you are starting from a known location.": "Шаг \"Относительное перемещение\" дает FarmBot-у команду двигаться на указанное расстояние относительно текущей позиции. Например, если FarmBot сейчас на позиции X=1000, Y=1000, и он получает эту команду с координатами X=0 и Y=3000, он переместится на позицию X=1000, Y=4000. Если перемещение выполняется по нескольким координатам, робот будет двигаться по диагонали. Если вам нужно, чтобы он двигался сначала по одной координате, а потом по другой - используйте несколько шагов \"Относительное перемещение\". Шаги \"Относительное перемещение\" должны следовать после шага \"Абсолютное перемещение\", чтобы движение робота начиналось с известной позиции.",
"The Read Pin step instructs FarmBot to read the current value of the specified pin. Pin Mode: Use digital for a 0 (LOW) or 1 (HIGH) response, and analog for a voltage reading (0-1023 for 0-5V).": "Шаг \"Считать пин\" дает FarmBot-у команду считать текущее значение указанного пина. Режим пина: используйте цифровой режим для считывания 0 (Низкий уровень) или 1 (Высокий уровень), и аналоговый для считывания напряжения (значения 0-1023 соответствуют 0-5В).",
"The Run Farmware step runs a Farmware package. Visit the Farmware page to install and manage Farmware.": "Шаг Run Farmware запускает Farmware package. Откройте страницу Farmware для установки и управления Farmware.",
"The Wait step instructs FarmBot to wait for the specified amount of time. Use it in combination with the Pin Write step to water for a length of time.": "Шаг \"Wait\" дает FarmBot-у команду подождать указанное время. Как пример, используйте его совместно с командой \"Записать пин\" для полива растения в течение указанного количества времени.",
"The Run Farmware step runs a Farmware package. Visit the Farmware page to install and manage Farmware.": "Шаг \"Запуск Farmware\" запускает выбранный плагин Farmware. Откройте страницу Farmware для установки и управления плагинами.",
"The Wait step instructs FarmBot to wait for the specified amount of time. Use it in combination with the Pin Write step to water for a length of time.": "Шаг \"Ожидание\" дает FarmBot-у команду подождать указанное время. Как пример, используйте его совместно с командой \"Записать пин\" для полива растения в течение указанного количества времени.",
"The Write Pin step instructs FarmBot to set the specified pin on the Arduino to the specified mode and value. Use the digital pin mode for on (1) and off (0) control, and analog pin mode for PWM (pulse width modulation) (0-255).": "Шаг \"Записать пин\" дает FarmBot-у команду перевести пин Arduino в указанный режим и задать ему указанное значение. Используйте цифровой режим для задания состояния Вкл (1) или Выкл (0), и аналоговый режим для ШИМ (Широтно-импульсной модуляции) (0-255).",
"The device has never been seen. Most likely, there is a network connectivity issue on the device's end.": "Робот не был замечен ни разу. Вероятнее всего, есть проблемы подключения к сети на стороне робота",
"The number of motor steps required to move the axis one millimeter.": "Количество шагов двигателя, за которое ось перемещается на один миллиметр.",
@ -466,8 +508,8 @@ module.exports = {
"Top Right": "Верх право",
"Turn off to set Web App to English.": "Выключите для перехода на Английский язык.",
"Type": "Тип",
"UP TO DATE": "UP TO DATE",
"UPDATE": "UPDATE",
"UP TO DATE": "Обновлено",
"UPDATE": "Обновить",
"USB Camera": "USB-камера",
"Unable to load webcam feed.": "Не удалось получить видеопоток с Web-камеры.",
"Unable to save farm event.": "Не удалось сохранить событие.",
@ -620,7 +662,7 @@ module.exports = {
"SYNCED": "СИНХРОНИЗИРОВАНО",
"SYNCING": "СИНХРОНИЗИРУЮ",
"Save ": "Сохранить ",
"Saved ": "Сохранено ",
"Saved ": "Сохранено ",
"Saved": "Сохранено",
"Saving": "Сохраняю",
"Send Password reset": "Отправить сброс пароля",
@ -655,4 +697,4 @@ module.exports = {
"never connected to device": "никогда не подключалось к устройству",
"to": "к",
"yes": "да"
}
}

View File

@ -21,6 +21,7 @@ import { SequenceBodyItem } from "farmbot/dist";
import * as _ from "lodash";
import { Actions } from "../constants";
import { maybeStartTracking } from "./maybe_start_tracking";
import { t } from "i18next";
export function edit(tr: TaggedResource, changes: Partial<typeof tr.body>):
ReduxAction<EditResourceParams> {
@ -280,7 +281,7 @@ const MUST_CONFIRM_LIST: ResourceName[] = [
const confirmationChecker = (resource: TaggedResource, force = false) =>
<T>(proceed: () => T): T | undefined => {
if (MUST_CONFIRM_LIST.includes(resource.kind)) {
if (force || confirm("Are you sure you want to delete this item?")) {
if (force || confirm(t("Are you sure you want to delete this item?"))) {
return proceed();
} else {
return undefined;

View File

@ -95,7 +95,7 @@ export function readStatus() {
export const onOffline = () => {
dispatchNetworkDown("user.mqtt");
error(t(Content.MQTT_DISCONNECTED));
error(t(Content.MQTT_DISCONNECTED),t("Error"));
};
export const changeLastClientConnected = (bot: Farmbot) => () => {

View File

@ -49,7 +49,7 @@ export function isLog(x: any): x is Log {
const commandErr = (_noun = "Command") => () => { };
export const commandOK = (noun = "Command") => () => {
const msg = noun + " request sent to device.";
const msg = t(noun) + t(" request sent to device.");
success(msg, t("Request sent"));
};
@ -90,7 +90,7 @@ export function emergencyLock() {
export function emergencyUnlock() {
const noun = "Emergency unlock";
if (confirm(`Are you sure you want to unlock the device?`)) {
if (confirm(t(`Are you sure you want to unlock the device?`))) {
getDevice()
.emergencyUnlock()
.then(commandOK(noun), commandErr(noun));

View File

@ -44,7 +44,7 @@ export class CameraSelection
getDevice()
.setUserEnv(message)
.then(() => {
success(t("Successfully configured camera!"));
success(t("Successfully configured camera!"),t("Success"));
})
.catch(() => error(t("An error occurred during configuration.")));
}

View File

@ -111,7 +111,7 @@ export function PlantPanel({ info, onDestroy, updatePlant }: PlantPanelProps) {
}
updatePlant(uuid, update);
}} />
: plantStatus}
: t(plantStatus) }
</span>
</li>
</ul>

View File

@ -34,8 +34,8 @@ function MetaInfo({ obj, attr, label }: MetaInfoProps) {
export class Photos extends React.Component<PhotosProps, {}> {
takePhoto = () => {
const ok = () => success(t("Processing now. Results usually available in one minute."));
const no = () => error(t("Error taking photo"));
const ok = () => success(t("Processing now. Results usually available in one minute."),t("Success"));
const no = () => error(t("Error taking photo"),t("Error"));
getDevice().takePhoto().then(ok, no);
}

View File

@ -51,7 +51,7 @@ export function deletePoints(
});
success(t("Deleted {{num}} {{points}}", {
num: ids.length, points: pointName
}));
}),t("Success"));
prog.finish();
})
.catch(function () {

View File

@ -30,8 +30,8 @@ export class WeedDetector
const percentage = `${Math.round((p.completed / p.total) * 100)} %`;
this.setState({ deletionProgress: p.isDone ? "" : percentage });
};
this.props.dispatch(deletePoints("weeds", "plant-detection", progress));
this.setState({ deletionProgress: "Deleting..." });
this.props.dispatch(deletePoints(t("weeds"), "plant-detection", progress));
this.setState({ deletionProgress: t("Deleting...") });
}
/** Mapping of HSV values to FBOS Env variables. */

View File

@ -87,7 +87,7 @@ export function commitBulkEditor(): Thunk {
return error(t("No day(s) selected."));
}
} else {
return error(t("Select a sequence from the dropdown first."));
return error(t("Select a sequence from the dropdown first."),t("Error"));
}
} else {
return error(t("Select a regimen first or create one."));

View File

@ -22,7 +22,7 @@ let count = 1;
function copy(regimen: TaggedRegimen | undefined) {
if (regimen) {
const r = defensiveClone(regimen);
r.body.name = r.body.name + " copy " + (count++);
r.body.name = r.body.name + t(" copy ") + (count++);
push("/app/regimens/" + urlFriendly(r.body.name));
r.body.id = undefined;
return regimen && init(r);

View File

@ -6,6 +6,7 @@ import { defensiveClone } from "../util";
import { push } from "../history";
import { urlFriendly } from "../util";
import { Actions } from "../constants";
import { t } from "i18next";
export function pushStep(step: SequenceBodyItem,
dispatch: Function,
@ -27,7 +28,7 @@ export function copySequence(payload: TaggedSequence) {
return function (dispatch: Function) {
const copy = defensiveClone(payload);
copy.body.id = undefined;
copy.body.name = copy.body.name + ` copy ${count++}`;
copy.body.name = copy.body.name + t(" copy ") + (count++);//+ t(" copy ") + (count++);
copy.uuid = "HEY REDUCER! Set this!";
dispatch(init(copy));
push("/app/sequences/" + urlFriendly(copy.body.name));

View File

@ -10,6 +10,7 @@ import { DropDownItem } from "../../../ui/index";
import { Vector3 } from "farmbot/dist";
import { TOOL } from "./interfaces";
import * as _ from "lodash";
import { t } from "i18next";
import { joinKindAndId } from "../../../resources/reducer";
export function activeTools(resources: ResourceIndex) {
@ -39,7 +40,7 @@ const HEADINGS: DropDownItem[] = [
...Object.keys(NAME_MAP)
.filter(x => x !== "ToolSlot")
.map((name: PointerTypeName | typeof TOOL) => ({
label: NAME_MAP[name],
label: t(NAME_MAP[name]),
heading: true,
value: 0,
headingId: name
@ -59,7 +60,7 @@ export function generateList(input: ResourceIndex,
.concat(HEADINGS)
.sortBy(SORT_KEY)
.reverse()
.concat({ label: "Other", heading: true, value: 0, headingId: "Other" })
.concat({ label: t("Other"), heading: true, value: 0, headingId: "Other" })
.concat(additionalItems)
.value();
}

View File

@ -97,7 +97,7 @@ class RefactoredSendMessage
return <StepWrapper>
<StepHeader
className={className}
helpText={ToolTips.SEND_MESSAGE}
helpText={t(ToolTips.SEND_MESSAGE)}
currentSequence={currentSequence}
currentStep={currentStep}
dispatch={dispatch}

View File

@ -7478,6 +7478,6 @@ yargs@~3.10.0:
decamelize "^1.0.0"
window-size "0.1.0"
yarn@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.5.1.tgz#e8680360e832ac89521eb80dad3a7bc27a40bab4"
yarn@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.6.0.tgz#9cec6f7986dc237d39ec705ce74d95155fe55d4b"