diff --git a/.github/workflows/dhis2-verify-app.yml b/.github/workflows/dhis2-verify-app.yml index d650fe898..94079da06 100644 --- a/.github/workflows/dhis2-verify-app.yml +++ b/.github/workflows/dhis2-verify-app.yml @@ -163,11 +163,66 @@ jobs: !cancelled() && github.ref == 'refs/heads/master' steps: + - name: Checkout code + uses: actions/checkout@master + + - name: Extract version + id: extract_version + uses: Saionaro/extract-package-version@v1.2.1 + - name: Send failure message to analytics-internal-bot slack channel id: slack uses: slackapi/slack-github-action@v1.23.0 with: channel-id: ${{ secrets.SLACK_CHANNEL_ID }} - slack-message: ':small_red_triangle_down: :dashboard-app: Dashboard-app release ' + payload: | + { + "text": ":small_red_triangle_down: :dashboard-app: Dashboard version ${{ steps.extract_version.outputs.version }} release ", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":small_red_triangle_down: :dashboard-app: Dashboard version ${{ steps.extract_version.outputs.version }} release " + } + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + + report-release-success: + runs-on: ubuntu-latest + needs: release + if: | + success() && + !cancelled() && + github.ref == 'refs/heads/master' + steps: + - name: Checkout code + uses: actions/checkout@master + + - name: Extract version + id: extract_version + uses: Saionaro/extract-package-version@v1.2.1 + + - name: Send success message to analytics-internal-bot slack channel + id: slack + uses: slackapi/slack-github-action@v1.23.0 + with: + channel-id: ${{ secrets.SLACK_CHANNEL_ID }} + payload: | + { + "text": ":large_green_circle: :dashboard-app: :tada: Dashboard app release succeeded for version: ${{ steps.extract_version.outputs.version }}", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":large_green_circle: :dashboard-app: :tada: Dashboard version ${{ steps.extract_version.outputs.version }} released " + } + } + ] + } env: SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} diff --git a/.tx/config b/.tx/config index e6ba0deb2..b0c41c74b 100644 --- a/.tx/config +++ b/.tx/config @@ -1,6 +1,6 @@ [main] host = https://www.transifex.com -lang_map = fa_AF: prs, uz@Cyrl: uz, uz@Latn: uz_Latn +lang_map = fa_AF: prs, uz@Cyrl: uz_UZ_Cyrl, uz@Latn: uz_UZ_Latn [o:hisp-uio:p:app-dashboards-app:r:en-pot] diff --git a/README.md b/README.md index a475317c4..400c39899 100644 --- a/README.md +++ b/README.md @@ -44,12 +44,10 @@ CYPRESS_DHIS2_PASSWORD=district The following commands can be used to run the tests: -| Command | Backend | Environment | Tests | -| ------------------- | :--------: | ----------: | -----------: | -| `yarn cy:open-live` | API server | Cypress UI | All | -| `yarn cy:run-live` | API server | Headless | All | -| `yarn cy:open-stub` | Fixtures | Cypress UI | Non-mutating | -| `yarn cy:run-stub` | Fixtures | Headless | Non-mutating | +| Comman | Backend | Environment | Tests | +| -------------- | :--------: | ----------: | ----: | +| `yarn cy:open` | API server | Cypress UI | All | +| `yarn cy:run` | API server | Headless | All | ### `yarn test` diff --git a/cypress/integration/edit/edit_dashboard/show_description.js b/cypress/integration/edit/edit_dashboard/show_description.js index 5d56f918b..de6d8d19e 100644 --- a/cypress/integration/edit/edit_dashboard/show_description.js +++ b/cypress/integration/edit/edit_dashboard/show_description.js @@ -1,9 +1,10 @@ import { When, Then } from 'cypress-cucumber-preprocessor/steps' import { clickViewActionButton } from '../../../elements/viewDashboard.js' -import { getApiBaseUrl } from '../../../support/server/utils.js' +import { getApiBaseUrl } from '../../../support/utils.js' -const SHOW_DESC_RESP_CODE_SUCCESS = 201 -const SHOW_DESC_RESP_CODE_FAIL = 409 +const RESP_CODE_200 = 200 +const RESP_CODE_201 = 201 +const RESP_CODE_FAIL = 409 before(() => { //ensure that the description is not currently shown @@ -15,7 +16,7 @@ before(() => { }, body: 'false', }).then((response) => - expect(response.status).to.equal(SHOW_DESC_RESP_CODE_SUCCESS) + expect(response.status).to.be.oneOf([RESP_CODE_201, RESP_CODE_200]) ) }) @@ -29,7 +30,7 @@ When('I click to show description', () => { cy.wait('@toggleDescription') .its('response.statusCode') - .should('eq', SHOW_DESC_RESP_CODE_SUCCESS) + .should('be.oneOf', [RESP_CODE_200, RESP_CODE_201]) }) When('I click to hide the description', () => { @@ -38,20 +39,20 @@ When('I click to hide the description', () => { cy.wait('@toggleDescription') .its('response.statusCode') - .should('eq', SHOW_DESC_RESP_CODE_SUCCESS) + .should('be.oneOf', [RESP_CODE_200, RESP_CODE_201]) }) // Error scenario When('clicking to show description fails', () => { cy.intercept('PUT', 'userDataStore/dashboard/showDescription', { - statusCode: SHOW_DESC_RESP_CODE_FAIL, + statusCode: RESP_CODE_FAIL, }).as('showDescriptionFails') clickViewActionButton('More') cy.contains('Show description').click() cy.wait('@showDescriptionFails') .its('response.statusCode') - .should('eq', SHOW_DESC_RESP_CODE_FAIL) + .should('eq', RESP_CODE_FAIL) }) Then( diff --git a/cypress/integration/edit/edit_dashboard/translate_dashboard.js b/cypress/integration/edit/edit_dashboard/translate_dashboard.js index 235897687..bcf0b4543 100644 --- a/cypress/integration/edit/edit_dashboard/translate_dashboard.js +++ b/cypress/integration/edit/edit_dashboard/translate_dashboard.js @@ -5,8 +5,7 @@ import { dashboardDescriptionSel, clickViewActionButton, } from '../../../elements/viewDashboard.js' -import { getApiBaseUrl } from '../../../support/server/utils.js' -import { EXTENDED_TIMEOUT } from '../../../support/utils.js' +import { getApiBaseUrl, EXTENDED_TIMEOUT } from '../../../support/utils.js' let norwegianTitle = '' let norwegianDesc = '' diff --git a/cypress/integration/view/dashboard_filter/create_dashboard.js b/cypress/integration/view/dashboard_filter/create_dashboard.js index 55a200d99..20b51b250 100644 --- a/cypress/integration/view/dashboard_filter/create_dashboard.js +++ b/cypress/integration/view/dashboard_filter/create_dashboard.js @@ -9,10 +9,10 @@ import { dashboardChipSel, dashboardTitleSel, } from '../../../elements/viewDashboard.js' -import { getApiBaseUrl } from '../../../support/server/utils.js' import { EXTENDED_TIMEOUT, createDashboardTitle, + getApiBaseUrl, } from '../../../support/utils.js' const TEST_DASHBOARD_TITLE = createDashboardTitle('af') diff --git a/cypress/integration/view/view_dashboard/resize_dashboards_bar.js b/cypress/integration/view/view_dashboard/resize_dashboards_bar.js index 51a312716..b7419dc36 100644 --- a/cypress/integration/view/view_dashboard/resize_dashboards_bar.js +++ b/cypress/integration/view/view_dashboard/resize_dashboards_bar.js @@ -5,6 +5,9 @@ import { } from '../../../elements/viewDashboard.js' import { EXTENDED_TIMEOUT } from '../../../support/utils.js' +const RESP_CODE_200 = 200 +const RESP_CODE_201 = 201 + // Scenario: I change the height of the control bar When('I drag to increase the height of the control bar', () => { cy.intercept('PUT', '/userDataStore/dashboard/controlBarRows').as('putRows') @@ -14,7 +17,9 @@ When('I drag to increase the height of the control bar', () => { .trigger('mousemove', { clientY: 300 }) .trigger('mouseup') - cy.wait('@putRows').its('response.statusCode').should('eq', 201) + cy.wait('@putRows') + .its('response.statusCode') + .should('be.oneOf', [RESP_CODE_200, RESP_CODE_201]) }) Then('the control bar height should be updated', () => { @@ -29,7 +34,9 @@ Then('the control bar height should be updated', () => { .trigger('mousedown') .trigger('mousemove', { clientY: 71 }) .trigger('mouseup') - cy.wait('@putRows').its('response.statusCode').should('eq', 201) + cy.wait('@putRows') + .its('response.statusCode') + .should('be.oneOf', [RESP_CODE_200, RESP_CODE_201]) }) When('I drag to decrease the height of the control bar', () => { @@ -40,5 +47,7 @@ When('I drag to decrease the height of the control bar', () => { .trigger('mousemove', { clientY: 300 }) .trigger('mouseup') - cy.wait('@putRows').its('response.statusCode').should('eq', 201) + cy.wait('@putRows') + .its('response.statusCode') + .should('be.oneOf', [RESP_CODE_200, RESP_CODE_201]) }) diff --git a/cypress/integration/view/view_dashboard/toggle_show_more_dashboards.js b/cypress/integration/view/view_dashboard/toggle_show_more_dashboards.js index b1dad68a1..dd9c41852 100644 --- a/cypress/integration/view/view_dashboard/toggle_show_more_dashboards.js +++ b/cypress/integration/view/view_dashboard/toggle_show_more_dashboards.js @@ -4,12 +4,14 @@ import { dashboardsBarContainerSel, showMoreLessSel, } from '../../../elements/viewDashboard.js' -import { getApiBaseUrl } from '../../../support/server/utils.js' -import { EXTENDED_TIMEOUT } from '../../../support/utils.js' +import { getApiBaseUrl, EXTENDED_TIMEOUT } from '../../../support/utils.js' const MIN_DASHBOARDS_BAR_HEIGHT = 71 const MAX_DASHBOARDS_BAR_HEIGHT = 431 +const RESP_CODE_200 = 200 +const RESP_CODE_201 = 201 + beforeEach(() => { cy.request({ method: 'PUT', @@ -18,7 +20,9 @@ beforeEach(() => { 'content-type': 'application/json', }, body: '1', - }).then((response) => expect(response.status).to.equal(201)) + }).then((response) => + expect(response.status).to.be.oneOf([RESP_CODE_201, RESP_CODE_200]) + ) }) When('I toggle show more dashboards', () => { diff --git a/cypress/integration/view/view_errors/error_while_show_description.js b/cypress/integration/view/view_errors/error_while_show_description.js index e63549f04..ac6830f01 100644 --- a/cypress/integration/view/view_errors/error_while_show_description.js +++ b/cypress/integration/view/view_errors/error_while_show_description.js @@ -1,5 +1,9 @@ import { When, Then } from 'cypress-cucumber-preprocessor/steps' -import { getApiBaseUrl } from '../../../support/server/utils.js' +import { getApiBaseUrl } from '../../../support/utils.js' + +const RESP_CODE_200 = 200 +const RESP_CODE_201 = 201 +const RESP_CODE_FAIL = 409 // Error scenario @@ -12,12 +16,14 @@ before(() => { 'content-type': 'application/json', }, body: 'false', - }).then((response) => expect(response.status).to.equal(201)) + }).then((response) => + expect(response.status).to.be.oneOf([RESP_CODE_201, RESP_CODE_200]) + ) }) When('clicking to show description fails', () => { cy.intercept('PUT', 'userDataStore/dashboard/showDescription', { - statusCode: 409, + statusCode: RESP_CODE_FAIL, }).as('showDescriptionFails') cy.get('button').contains('More').click() @@ -25,7 +31,7 @@ When('clicking to show description fails', () => { cy.wait('@showDescriptionFails') .its('response.statusCode') - .should('eq', 409) + .should('eq', RESP_CODE_FAIL) }) Then( diff --git a/cypress/support/index.js b/cypress/support/index.js index 356da91ea..116b3858b 100644 --- a/cypress/support/index.js +++ b/cypress/support/index.js @@ -1,14 +1,7 @@ import { enableAutoLogin } from '@dhis2/cypress-commands' -import { enableNetworkShim } from './server/index.js' -import { getDefaultMode, isStubMode } from './server/utils.js' import './commands.js' -enableNetworkShim() - -if (!isStubMode(getDefaultMode())) { - // log in if using a live backend - enableAutoLogin() -} +enableAutoLogin() const resizeObserverLoopErrRe = /^[^(ResizeObserver loop limit exceeded)]/ Cypress.on('uncaught:exception', (err) => { diff --git a/cypress/support/server/Networkshim.js b/cypress/support/server/Networkshim.js deleted file mode 100644 index 6ae470270..000000000 --- a/cypress/support/server/Networkshim.js +++ /dev/null @@ -1,157 +0,0 @@ -import { - getFileName, - getApiBaseUrl, - removeAPIServerFromUrlPaths, -} from './utils.js' - -export default class NetworkShim { - constructor(hosts) { - this.state = null - this.hosts = hosts - } - - initCaptureMode() { - this.state = { - totalSize: 0, - duplicates: 0, - nonDeterministicResponses: 0, - requests: {}, - } - } - - initStubMode() { - cy.readFile(getFileName()).then((file) => { - this.state = { - requests: this.parseFileRequests(file.requests), - } - }) - } - - parseFileRequests(requests) { - return requests.reduce((acc, request) => { - const { method, path, requestBody } = request - const key = this.createKey(method, path, requestBody) - request.response = JSON.parse(request.response) - acc[key] = request - return acc - }, {}) - } - - captureRequestsAndResponses() { - cy.server({ - onAnyRequest: this.captureRequest, - onAnyResponse: this.captureResponse, - }) - } - - createStubRoutes() { - cy.server() - Object.values(this.state.requests).forEach((stub) => { - cy.route({ - url: getApiBaseUrl() + stub.path, - method: stub.method, - /* - TODO: for POST / PUT requests we will quite likely have to - be able to differentiate between different request bodies - specifying a body in the route options could theoretically be - a way to do so, but quite likely it doesn't work. I have posted - a question on Stackoverlflow about this topic: - https://stackoverflow.com/questions/62530197/how-to-access-request-body-in-cy-route-response-callback - */ - body: stub.requestBody || undefined, - response: stub.response, - }) - }) - } - - processRequest(xhr) { - const host = this.hosts.find((host) => xhr.url.indexOf(host) === 0) - const path = xhr.url.substr(host.length) - const key = this.createKey(xhr.method, path, xhr.request.body) - - return { host, path, key } - } - - createKey(method, path, requestBody) { - const sections = [method, path] - - if (requestBody) { - sections.push(JSON.stringify(requestBody)) - } - - return sections.join('__') - } - - captureRequest = (_, xhr) => { - const { host, path, key } = this.processRequest(xhr) - if (!host) { - // pass through - return xhr - } - - if (this.state.requests[key]) { - // Repeated request - this.state.requests[key].count += 1 - this.state.duplicates += 1 - } else { - // New request - this.state.requests[key] = { - path, - method: xhr.method, - requestBody: xhr.request.body, - count: 1, - response: null, - } - } - return xhr - } - - captureResponse = async (_, xhr) => { - const { host, key } = this.processRequest(xhr) - if (!host) { - // pass through - return xhr - } - - const stateRequest = this.state.requests[key] - const { size, text } = await this.createResponseBlob(xhr) - - const scrubbedText = removeAPIServerFromUrlPaths(text) - - if (stateRequest.response) { - if (scrubbedText !== stateRequest.response) { - this.state.nonDeterministicResponses += 1 - stateRequest.nonDeterministic = true - } - } else { - // TODO: Capture response headers - stateRequest.response = scrubbedText - stateRequest.size = size - - this.state.totalSize += size - } - - return xhr - } - - async createResponseBlob(xhr) { - const responseBodyStr = JSON.stringify(xhr.response.body) - const blob = new Blob([responseBodyStr], { type: 'application/json' }) - const size = blob.size - const text = await blob.text() - - return { size, text } - } - - writeFile() { - const requestArray = Object.values(this.state.requests) - cy.log( - `Networkshim successfully captured ${requestArray.length} requests`, - this.state - ) - cy.writeFile(getFileName(), { - ...this.state, - requests: requestArray, - }) - } -} diff --git a/cypress/support/server/constants.js b/cypress/support/server/constants.js deleted file mode 100644 index de2af8e91..000000000 --- a/cypress/support/server/constants.js +++ /dev/null @@ -1,9 +0,0 @@ -export const API_STUB_MODES = { - STUB: 'STUB', - DISABLED: 'DISABLED', - CAPTURE: 'CAPTURE', -} -export const DEFAULT_API_STUB_MODE = API_STUB_MODES.STUB - -export const NETWORK_FIXTURES_FILE_PATH = - 'cypress/fixtures/network/requests.json' diff --git a/cypress/support/server/enableNetworkShim.js b/cypress/support/server/enableNetworkShim.js deleted file mode 100644 index 37eba42bb..000000000 --- a/cypress/support/server/enableNetworkShim.js +++ /dev/null @@ -1,36 +0,0 @@ -import NetworkShim from './Networkshim.js' -import { isDisabledMode, isCaptureMode, getApiBaseUrl } from './utils.js' -import visitWithUnfetchOverwriteFn from './visitWithUnfetchOverwriteFn.js' - -export default function enableNetworkShim(hosts = [getApiBaseUrl()]) { - // No need to stub anything when disabled - if (isDisabledMode()) { - return - } - // Replace window.fetch with unfetch, which uses XHR and cypress can work with this - Cypress.Commands.overwrite('visit', visitWithUnfetchOverwriteFn) - - const networkShim = new NetworkShim(hosts) - - before(() => { - if (isCaptureMode()) { - networkShim.initCaptureMode() - } else { - networkShim.initStubMode() - } - }) - - beforeEach(() => { - if (isCaptureMode()) { - networkShim.captureRequestsAndResponses() - } else { - networkShim.createStubRoutes() - } - }) - - after(() => { - if (isCaptureMode()) { - networkShim.writeFile() - } - }) -} diff --git a/cypress/support/server/index.js b/cypress/support/server/index.js deleted file mode 100644 index afd69b8ac..000000000 --- a/cypress/support/server/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as enableNetworkShim } from './enableNetworkShim.js' diff --git a/cypress/support/server/utils.js b/cypress/support/server/utils.js deleted file mode 100644 index 4b69c2c6b..000000000 --- a/cypress/support/server/utils.js +++ /dev/null @@ -1,37 +0,0 @@ -import { - API_STUB_MODES, - DEFAULT_API_STUB_MODE, - NETWORK_FIXTURES_FILE_PATH, -} from './constants.js' - -export const getApiBaseUrl = () => { - const baseUrl = Cypress.env('dhis2_base_url') || '' - - if (!baseUrl) { - throw new Error( - 'No `dhis2_base_url` found. Please make sure to add it to `cypress.env.json`' - ) - } - - return baseUrl -} - -export const getDefaultMode = () => - Cypress.env('dhis2_api_stub_mode') || DEFAULT_API_STUB_MODE - -export const isDisabledMode = () => - Cypress.env('dhis2_api_stub_mode') === API_STUB_MODES.DISABLED - -export const isCaptureMode = () => - Cypress.env('dhis2_api_stub_mode') === API_STUB_MODES.CAPTURE - -export const isStubMode = () => - Cypress.env('dhis2_api_stub_mode') === API_STUB_MODES.STUB - -export const getFileName = () => NETWORK_FIXTURES_FILE_PATH - -export const removeAPIServerFromUrlPaths = (text) => { - const apiEndpointUrl = new RegExp(`${getApiBaseUrl()}/api`, 'gi') - - return text.replace(apiEndpointUrl, '') -} diff --git a/cypress/support/server/visitWithUnfetchOverwriteFn.js b/cypress/support/server/visitWithUnfetchOverwriteFn.js deleted file mode 100644 index 282a6abf7..000000000 --- a/cypress/support/server/visitWithUnfetchOverwriteFn.js +++ /dev/null @@ -1,16 +0,0 @@ -const visitWithUnfetchOverwriteFn = (originalFn, url, options = {}) => - cy - .readFile('cypress/assets/unfetch.umd.js', { log: false }) - .then((content) => - originalFn(url, { - ...options, - onBeforeLoad: (win) => { - delete win.fetch - win.eval(content) - win.fetch = win.unfetch - options.onBeforeLoad && options.onBeforeLoad(win) - }, - }) - ) - -export default visitWithUnfetchOverwriteFn diff --git a/cypress/support/utils.js b/cypress/support/utils.js index 909d50129..a4a40c59d 100644 --- a/cypress/support/utils.js +++ b/cypress/support/utils.js @@ -1,5 +1,17 @@ export const EXTENDED_TIMEOUT = { timeout: 25000 } +export const getApiBaseUrl = () => { + const baseUrl = Cypress.env('dhis2_base_url') || '' + + if (!baseUrl) { + throw new Error( + 'No `dhis2_base_url` found. Please make sure to add it to `cypress.env.json`' + ) + } + + return baseUrl +} + export const goOffline = () => { cy.log('**go offline**') .then(() => { diff --git a/i18n/es.po b/i18n/es.po index fa73121f5..34982d30b 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -4,10 +4,11 @@ # Sergio Valenzuela , 2020 # Gabriela Rodriguez , 2021 # Alison Andrade , 2021 -# phil_dhis2, 2021 -# Viktor Varland , 2021 # Prabhjot Singh, 2021 +# Philip Larsen Donnelly, 2021 +# Viktor Varland , 2021 # Marta Vila , 2023 +# Enzo Nicolas Rossi , 2023 # Janeth Cruz, 2023 # msgid "" @@ -36,10 +37,10 @@ msgid "Search for a dashboard" msgstr "Buscar un tablero" msgid "Show fewer dashboards" -msgstr "Mostrar menos paneles" +msgstr "Mostrar menos tableros" msgid "Show more dashboards" -msgstr "Mostrar más paneles" +msgstr "Mostrar más tableros" msgid "Remove this item" msgstr "Eliminar este elemento" @@ -82,7 +83,7 @@ msgid "Add text here" msgstr "Añada texto aquí" msgid "Filters are not applied to line list dashboard items" -msgstr "" +msgstr "Los filtros no se aplican a los elementos del tablero de listados" msgid "Filters not applied" msgstr "Filtros no aplicados" @@ -121,7 +122,7 @@ msgid "There was a problem loading interpretations for this item" msgstr "Hubo un problema al cargar las interpretaciones de este elemento." msgid "The plugin for rendering this item is not available" -msgstr "El complemento para renderizar este elemento no está disponible" +msgstr "El plugin para cargar este elemento no está disponible" msgid "Install the {{appName}} app from the App Hub" msgstr "Instalar la aplicación {{appName}} desde el App Hub" @@ -134,6 +135,9 @@ msgid "" " '.'\n" " )} or higher in order to display this item." msgstr "" +"Instale la versión de la aplicación Listados ${minLLVersion.join(\n" +" '.'\n" +" )} o superior para mostrar este elemento." msgid "Show without filters" msgstr "Mostrar sin filtros" @@ -173,7 +177,7 @@ msgid "Event charts" msgstr "Herramienta para gráficos con información individual" msgid "Line lists" -msgstr "" +msgstr "Listados" msgid "Apps" msgstr "Aplicaciones" @@ -191,8 +195,8 @@ msgid "" "Failed to save dashboard. You might be offline or not have access to edit " "this dashboard." msgstr "" -"No se pudo guardar el tablero de mando. Es posible que esté desconectado o " -"no tenga acceso para editar este tablero de mando." +"No se pudo guardar el tablero. Es posible que esté desconectado o no tenga " +"acceso para editar este tablero de mando." msgid "" "Failed to save dashboard. This code is already being used on another " @@ -205,8 +209,8 @@ msgid "" "Failed to delete dashboard. You might be offline or not have access to edit " "this dashboard." msgstr "" -"No se pudo eliminar el tablero de mando. Es posible que esté desconectado o " -"no tenga acceso para editar este tablero de mando." +"No se pudo eliminar el tablero. Es posible que esté desconectado o no tenga " +"acceso para editar este tablero de mando." msgid "Cannot save this dashboard while offline" msgstr "No se puede guardar sin conexión a internet" @@ -297,10 +301,10 @@ msgid "" " as filters. Alternatively, only selected dimensions can\n" " be made available on a dashboard." msgstr "" -"Tableros se pueden filtrar por dimensiones para cambiar\n" -" los datos mostrados. De forma predeterminada, todas las dimensiones están disponibles\n" +"Los tableros se pueden filtrar por dimensiones para cambiar\n" +" los datos mostrados. Por defecto, todas las dimensiones están disponibles\n" " como filtros. Alternativamente, solo las dimensiones seleccionadas pueden\n" -" estar disponibles en un tablero." +" estar disponible en un tablero." msgid "Available Filters" msgstr "Filtros disponibles" @@ -342,7 +346,7 @@ msgid "Dashboard layout" msgstr "Diseño del tablero" msgid "Freeflow" -msgstr "" +msgstr "Diseño libre" msgid "Dashboard items can be placed anywhere, at any size." msgstr "" @@ -395,9 +399,9 @@ msgstr "Diseño" msgid "{{count}} columns" msgid_plural "{{count}} columns" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{contar}} columna" +msgstr[1] "{{contar}} columnas" +msgstr[2] "{{contar}} columnas" msgid "Change layout" msgstr "Cambiar diseño" @@ -421,7 +425,7 @@ msgid "one item per page" msgstr "Un elemento por página" msgid "Print Preview" -msgstr "Impresión de vista previa" +msgstr "Vista previa de impresión" msgid "For best print results" msgstr "Para mejores resultados de impresión" @@ -487,13 +491,13 @@ msgstr "" "los demás filtros. ¿Desea eliminar todos los filtros en este tablero?" msgid "No, cancel" -msgstr "No, cancela" +msgstr "No, cancelar" msgid "Yes, remove filters" msgstr "Sí, eliminar filtros" msgid "The dashboard couldn't be made available offline. Try again." -msgstr "El tablero no pudo estar disponible sin conexión. Intentar otra vez" +msgstr "El tablero no esta disponible sin conexión. Intentar otra vez" msgid "Failed to unstar the dashboard" msgstr "No se pudo desmarcar el tablero" diff --git a/i18n/km.po b/i18n/km.po index 6f1247d25..dcafdbaca 100644 --- a/i18n/km.po +++ b/i18n/km.po @@ -1,15 +1,16 @@ # # Translators: # Viktor Varland , 2019 -# phil_dhis2, 2021 +# Philip Larsen Donnelly, 2021 +# channara rin, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-12-21T08:20:25.327Z\n" +"POT-Creation-Date: 2023-05-03T11:08:21.315Z\n" "PO-Revision-Date: 2019-06-25 12:37+0000\n" -"Last-Translator: phil_dhis2, 2021\n" -"Language-Team: Khmer (https://www.transifex.com/hisp-uio/teams/100509/km/)\n" +"Last-Translator: channara rin, 2023\n" +"Language-Team: Khmer (https://app.transifex.com/hisp-uio/teams/100509/km/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -71,6 +72,12 @@ msgstr "" msgid "Add text here" msgstr "" +msgid "Filters are not applied to line list dashboard items" +msgstr "" + +msgid "Filters not applied" +msgstr "" + msgid "There was a problem loading this dashboard item" msgstr "" @@ -104,15 +111,30 @@ msgstr "" msgid "There was a problem loading interpretations for this item" msgstr "" -msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgid "The plugin for rendering this item is not available" msgstr "" -msgid "Unable to load the plugin for this item" +msgid "Install the {{appName}} app from the App Hub" msgstr "" msgid "No data to display" msgstr "" +msgid "" +"Install Line Listing app version ${minLLVersion.join(\n" +" '.'\n" +" )} or higher in order to display this item." +msgstr "" + +msgid "Show without filters" +msgstr "" + +msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgstr "" + +msgid "Unable to load the plugin for this item" +msgstr "" + msgid "There was an error loading data for this item" msgstr "" @@ -140,6 +162,9 @@ msgstr "" msgid "Event charts" msgstr "" +msgid "Line lists" +msgstr "" + msgid "Apps" msgstr "" @@ -210,7 +235,7 @@ msgid "Cancel" msgstr "បោះបង់" msgid "Discard changes" -msgstr "" +msgstr "លុបការកែប្រែ" msgid "" "This dashboard has unsaved changes. Are you sure you want to leave and " diff --git a/i18n/lo.po b/i18n/lo.po index 38a573c2c..d31d515d5 100644 --- a/i18n/lo.po +++ b/i18n/lo.po @@ -1,17 +1,17 @@ # # Translators: # Viktor Varland , 2020 -# phil_dhis2, 2021 +# Philip Larsen Donnelly, 2021 # Somkhit Bouavong , 2022 -# Saysamone Sibounma, 2022 +# Saysamone Sibounma, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-12-21T08:20:25.327Z\n" +"POT-Creation-Date: 2023-05-03T11:08:21.315Z\n" "PO-Revision-Date: 2019-06-25 12:37+0000\n" -"Last-Translator: Saysamone Sibounma, 2022\n" -"Language-Team: Lao (https://www.transifex.com/hisp-uio/teams/100509/lo/)\n" +"Last-Translator: Saysamone Sibounma, 2023\n" +"Language-Team: Lao (https://app.transifex.com/hisp-uio/teams/100509/lo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -73,6 +73,12 @@ msgstr "ລາຍການທີ່ເປັນໜັງສື" msgid "Add text here" msgstr "ເພີ້ມໜັງສືບ່ອນນີ້" +msgid "Filters are not applied to line list dashboard items" +msgstr "" + +msgid "Filters not applied" +msgstr "" + msgid "There was a problem loading this dashboard item" msgstr "" @@ -106,15 +112,30 @@ msgstr "" msgid "There was a problem loading interpretations for this item" msgstr "" -msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgid "The plugin for rendering this item is not available" msgstr "" -msgid "Unable to load the plugin for this item" +msgid "Install the {{appName}} app from the App Hub" msgstr "" msgid "No data to display" msgstr "" +msgid "" +"Install Line Listing app version ${minLLVersion.join(\n" +" '.'\n" +" )} or higher in order to display this item." +msgstr "" + +msgid "Show without filters" +msgstr "" + +msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgstr "" + +msgid "Unable to load the plugin for this item" +msgstr "" + msgid "There was an error loading data for this item" msgstr "" @@ -142,6 +163,9 @@ msgstr "ບົດລາຍງານເຫດການຕ່າງໆ" msgid "Event charts" msgstr "ບົດລາຍງານເຫດການແບບແຜ່ນວາດ" +msgid "Line lists" +msgstr "" + msgid "Apps" msgstr "ແອັບ" @@ -226,7 +250,7 @@ msgid "Yes, discard changes" msgstr "" msgid "No access" -msgstr "" +msgstr "ບໍ່ມີການເຂົ້າເຖີງ" msgid "Not supported" msgstr "" diff --git a/i18n/nb.po b/i18n/nb.po index cc85f0220..bfc92ac6e 100644 --- a/i18n/nb.po +++ b/i18n/nb.po @@ -1,16 +1,16 @@ # # Translators: # Caroline Hesthagen Holen , 2021 -# Karoline Tufte Lien , 2021 # Jan Henrik Øverland, 2022 +# Karoline Tufte Lien , 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-12-21T08:20:25.327Z\n" +"POT-Creation-Date: 2023-05-03T11:08:21.315Z\n" "PO-Revision-Date: 2019-06-25 12:37+0000\n" -"Last-Translator: Jan Henrik Øverland, 2022\n" -"Language-Team: Norwegian Bokmål (https://www.transifex.com/hisp-uio/teams/100509/nb/)\n" +"Last-Translator: Karoline Tufte Lien , 2023\n" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/hisp-uio/teams/100509/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -74,6 +74,12 @@ msgstr "Tekstelement" msgid "Add text here" msgstr "Legg til tekst her" +msgid "Filters are not applied to line list dashboard items" +msgstr "" + +msgid "Filters not applied" +msgstr "" + msgid "There was a problem loading this dashboard item" msgstr "Det oppstod et problem med å laste inn dette dashbordelementet" @@ -107,15 +113,30 @@ msgstr "Vis som kart" msgid "There was a problem loading interpretations for this item" msgstr "" -msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgid "The plugin for rendering this item is not available" msgstr "" -msgid "Unable to load the plugin for this item" -msgstr "Kan ikke laste inn plugin-modulen for dette elementet" +msgid "Install the {{appName}} app from the App Hub" +msgstr "" msgid "No data to display" msgstr "Ingen data å vise" +msgid "" +"Install Line Listing app version ${minLLVersion.join(\n" +" '.'\n" +" )} or higher in order to display this item." +msgstr "" + +msgid "Show without filters" +msgstr "" + +msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgstr "" + +msgid "Unable to load the plugin for this item" +msgstr "Kan ikke laste inn plugin-modulen for dette elementet" + msgid "There was an error loading data for this item" msgstr "" @@ -123,7 +144,7 @@ msgid "Open this item in {{appName}}" msgstr "" msgid "Not available offline" -msgstr "" +msgstr "Ikke tilgjengelig i frakoblet modus" msgid "Visualizations" msgstr "Visualiseringer" @@ -143,6 +164,9 @@ msgstr "Hendelsesrapporter" msgid "Event charts" msgstr "Hendelsesdiagrammer" +msgid "Line lists" +msgstr "" + msgid "Apps" msgstr "Applikasjoner" @@ -229,7 +253,7 @@ msgid "No, stay here" msgstr "Nei, bli her" msgid "Yes, discard changes" -msgstr "" +msgstr "Ja, forkast endringer" msgid "No access" msgstr "Ingen tilgang" diff --git a/i18n/nl.po b/i18n/nl.po index 0dc964de1..6331242cb 100644 --- a/i18n/nl.po +++ b/i18n/nl.po @@ -163,13 +163,13 @@ msgid "Maps" msgstr "Kaarten" msgid "Event reports" -msgstr "Gebeurtenissen rapporten" +msgstr "Evenement rapporten" msgid "Event charts" -msgstr "" +msgstr "Evenementen grafiek" msgid "Line lists" -msgstr "" +msgstr "Lijn -lijsten" msgid "Apps" msgstr "Apps" @@ -489,7 +489,7 @@ msgstr "" "eens." msgid "Failed to unstar the dashboard" -msgstr "" +msgstr "Kan het dashboard niet ongedaan maken" msgid "Failed to star the dashboard" msgstr "Sterren geven aan het dashboard mislukt" @@ -504,7 +504,7 @@ msgid "Sync offline data now" msgstr "Synchroniseer nu offline gegevens" msgid "Unstar dashboard" -msgstr "" +msgstr "Dashboard ongedaan maken" msgid "Star dashboard" msgstr "Sterrendashboard" diff --git a/i18n/uk.po b/i18n/uk.po index b46ed9d37..c8145c07c 100644 --- a/i18n/uk.po +++ b/i18n/uk.po @@ -1,17 +1,18 @@ # # Translators: # Viktor Varland , 2020 -# phil_dhis2, 2021 +# Philip Larsen Donnelly, 2021 # Wanda , 2021 # Éva Tamási, 2022 +# Nadiia , 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-12-21T08:20:25.327Z\n" +"POT-Creation-Date: 2023-05-03T11:08:21.315Z\n" "PO-Revision-Date: 2019-06-25 12:37+0000\n" -"Last-Translator: Éva Tamási, 2022\n" -"Language-Team: Ukrainian (https://www.transifex.com/hisp-uio/teams/100509/uk/)\n" +"Last-Translator: Nadiia , 2023\n" +"Language-Team: Ukrainian (https://app.transifex.com/hisp-uio/teams/100509/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -75,6 +76,13 @@ msgstr "Текстовий об'єкт" msgid "Add text here" msgstr "Додати текст сюди" +msgid "Filters are not applied to line list dashboard items" +msgstr "" +"Фільтри не застосовуються до елементів інформаційної панелі списку рядків" + +msgid "Filters not applied" +msgstr "Фільтри не застосовані" + msgid "There was a problem loading this dashboard item" msgstr "" "Під час завантаження цього елемента інформаційної панелі сталася помилка" @@ -109,6 +117,27 @@ msgstr "Переглянути як мапу" msgid "There was a problem loading interpretations for this item" msgstr "Під час завантаження інтерпретацій для цього об'єкта сталася помилка" +msgid "The plugin for rendering this item is not available" +msgstr "Плагін для відтворення цього елемента недоступний" + +msgid "Install the {{appName}} app from the App Hub" +msgstr "Установіть програму {{appName}} із App Hub" + +msgid "No data to display" +msgstr "Немає даних для відображення" + +msgid "" +"Install Line Listing app version ${minLLVersion.join(\n" +" '.'\n" +" )} or higher in order to display this item." +msgstr "" +"Встановіть версію програми Line Listing ${minLLVersion.join(\n" +" '.'\n" +" )} або вище, щоб відобразити цей елемент." + +msgid "Show without filters" +msgstr "Показати без фільтрів" + msgid "Maps with Earth Engine layers cannot be displayed when offline" msgstr "" "Мапи з шарами Earth Engine не можуть відображатися в автономному режимі" @@ -116,9 +145,6 @@ msgstr "" msgid "Unable to load the plugin for this item" msgstr "Неможливо завантажити плагін для цього елемента" -msgid "No data to display" -msgstr "Немає даних для відображення" - msgid "There was an error loading data for this item" msgstr "Сталася помилка під час завантаження даних для цього елемента" @@ -146,6 +172,9 @@ msgstr "Звіти про події" msgid "Event charts" msgstr "Діаграми подій" +msgid "Line lists" +msgstr "Списки рядків" + msgid "Apps" msgstr "Додатки" diff --git a/i18n/uz.po b/i18n/uz_UZ_Cyrl.po similarity index 95% rename from i18n/uz.po rename to i18n/uz_UZ_Cyrl.po index 58640abb8..b5375c94a 100644 --- a/i18n/uz.po +++ b/i18n/uz_UZ_Cyrl.po @@ -5,10 +5,10 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-12-21T08:20:25.327Z\n" +"POT-Creation-Date: 2023-05-03T11:08:21.315Z\n" "PO-Revision-Date: 2019-06-25 12:37+0000\n" "Last-Translator: Ibatov , 2021\n" -"Language-Team: Uzbek (Cyrillic) (https://www.transifex.com/hisp-uio/teams/100509/uz@Cyrl/)\n" +"Language-Team: Uzbek (Cyrillic) (https://app.transifex.com/hisp-uio/teams/100509/uz@Cyrl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -72,6 +72,12 @@ msgstr "Матн элементи" msgid "Add text here" msgstr "Матнни шу ерга қўшинг" +msgid "Filters are not applied to line list dashboard items" +msgstr "" + +msgid "Filters not applied" +msgstr "" + msgid "There was a problem loading this dashboard item" msgstr "Ушбу панел элементлари юкланишида муаамога дуч келинди" @@ -105,15 +111,30 @@ msgstr "Харита сифатида кўриш" msgid "There was a problem loading interpretations for this item" msgstr "" -msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgid "The plugin for rendering this item is not available" msgstr "" -msgid "Unable to load the plugin for this item" -msgstr "Ушбу элемент учун плагин юкланмади" +msgid "Install the {{appName}} app from the App Hub" +msgstr "" msgid "No data to display" msgstr "Маълумот экранга чиқарилмади" +msgid "" +"Install Line Listing app version ${minLLVersion.join(\n" +" '.'\n" +" )} or higher in order to display this item." +msgstr "" + +msgid "Show without filters" +msgstr "" + +msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgstr "" + +msgid "Unable to load the plugin for this item" +msgstr "Ушбу элемент учун плагин юкланмади" + msgid "There was an error loading data for this item" msgstr "" @@ -141,6 +162,9 @@ msgstr "Ҳодисалар ҳисоботи" msgid "Event charts" msgstr "Ҳодисалар диаграммаларда" +msgid "Line lists" +msgstr "" + msgid "Apps" msgstr "Илова" diff --git a/i18n/uz_UZ_Latn.po b/i18n/uz_UZ_Latn.po new file mode 100644 index 000000000..5c9902681 --- /dev/null +++ b/i18n/uz_UZ_Latn.po @@ -0,0 +1,547 @@ +# +# Translators: +# Yury Rogachev , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"POT-Creation-Date: 2023-05-03T11:08:21.315Z\n" +"PO-Revision-Date: 2019-06-25 12:37+0000\n" +"Last-Translator: Yury Rogachev , 2021\n" +"Language-Team: Uzbek (Latin) (https://app.transifex.com/hisp-uio/teams/100509/uz@Latn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz@Latn\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Untitled dashboard" +msgstr "Nomsiz boshqaruv paneli" + +msgid "Cannot create a dashboard while offline" +msgstr "" + +msgid "Create new dashboard" +msgstr "" + +msgid "Search for a dashboard" +msgstr "Boshqarish panelida izlash" + +msgid "Show fewer dashboards" +msgstr "" + +msgid "Show more dashboards" +msgstr "" + +msgid "Remove this item" +msgstr "" + +msgid "This item has been shortened to fit on one page" +msgstr "Ushbu element bir sahifaga joylashtirish uchun moslashtirildi" + +msgid "Remove" +msgstr "Olib tashlash" + +msgid "Messages" +msgstr "Xabarlar" + +msgid "See all messages" +msgstr "Barcha xabarlarni koʼrish" + +msgid "Item type \"{{type}}\" is not supported" +msgstr "" + +msgid "The item type is missing" +msgstr "" + +msgid "Filters applied" +msgstr "Filtr qoʼllanildi" + +msgid "Spacer" +msgstr "Boʼsh joy" + +msgid "" +"Use a spacer to create empty vertical space between other dashboard items." +msgstr "" +"Monitoring panelida elementlar orasida vertikal boʼsh joy yaratish uchun " +"boʼsh joy qoldirish funktsiyasidan foydalaning" + +msgid "Text item" +msgstr "Matn elementi" + +msgid "Add text here" +msgstr "Matnni shu yerga qoʼshing" + +msgid "Filters are not applied to line list dashboard items" +msgstr "" + +msgid "Filters not applied" +msgstr "" + +msgid "There was a problem loading this dashboard item" +msgstr "Ushbu panel elementlari yuklanishida muaamoga duch kelindi" + +msgid "Hide details and interpretations" +msgstr "" + +msgid "Show details and interpretations" +msgstr "" + +msgid "Open in {{appName}} app" +msgstr "Ilovada {{appName}} da ochish" + +msgid "View fullscreen" +msgstr "" + +msgid "This map can't be displayed as a chart" +msgstr "" + +msgid "View as Chart" +msgstr "Diagramma sifatida koʼrish" + +msgid "This map can't be displayed as a table" +msgstr "" + +msgid "View as Table" +msgstr "Jadval sifatida koʼrish" + +msgid "View as Map" +msgstr "Xarita sifatida koʼrish" + +msgid "There was a problem loading interpretations for this item" +msgstr "" + +msgid "The plugin for rendering this item is not available" +msgstr "" + +msgid "Install the {{appName}} app from the App Hub" +msgstr "" + +msgid "No data to display" +msgstr "Maʼlumot ekranga chiqarilmadi" + +msgid "" +"Install Line Listing app version ${minLLVersion.join(\n" +" '.'\n" +" )} or higher in order to display this item." +msgstr "" + +msgid "Show without filters" +msgstr "" + +msgid "Maps with Earth Engine layers cannot be displayed when offline" +msgstr "" + +msgid "Unable to load the plugin for this item" +msgstr "Ushbu element uchun plagin yuklanmadi" + +msgid "There was an error loading data for this item" +msgstr "" + +msgid "Open this item in {{appName}}" +msgstr "" + +msgid "Not available offline" +msgstr "" + +msgid "Visualizations" +msgstr "Vizualizatsiya" + +msgid "Pivot tables" +msgstr "" + +msgid "Charts" +msgstr "Diagrammalar" + +msgid "Maps" +msgstr "Xaritalar" + +msgid "Event reports" +msgstr "Hodisalar hisoboti" + +msgid "Event charts" +msgstr "Hodisalar diagrammalarda" + +msgid "Line lists" +msgstr "" + +msgid "Apps" +msgstr "Ilova" + +msgid "Reports" +msgstr "Hisobotlar" + +msgid "Resources" +msgstr "Resurslar" + +msgid "Users" +msgstr "Foydalanuvchilar" + +msgid "" +"Failed to save dashboard. You might be offline or not have access to edit " +"this dashboard." +msgstr "" + +msgid "" +"Failed to save dashboard. This code is already being used on another " +"dashboard." +msgstr "" + +msgid "" +"Failed to delete dashboard. You might be offline or not have access to edit " +"this dashboard." +msgstr "" + +msgid "Cannot save this dashboard while offline" +msgstr "" + +msgid "Save changes" +msgstr "Oʼzgartirishni saqlash" + +msgid "Exit print preview" +msgstr "" + +msgid "Print preview" +msgstr "Chop etishdan avvalgi koʼrik" + +msgid "Filter settings" +msgstr "" + +msgid "Translate" +msgstr "Tarjima qiling" + +msgid "Cannot delete this dashboard while offline" +msgstr "" + +msgid "Delete" +msgstr "Oʼchirib tashlash" + +msgid "Exit without saving" +msgstr "Saqlamasdan chiqish" + +msgid "Go to dashboards" +msgstr "Boshqaruv panellariga oʼtish" + +msgid "Delete dashboard" +msgstr "Boshqaruv panelini oʼchirib tashlash" + +msgid "" +"Deleting dashboard \"{{ dashboardName }}\" will remove it for all users. " +"This action cannot be undone. Are you sure you want to permanently delete " +"this dashboard?" +msgstr "" +"Panelni oʼchirib tashlash {{ dashboardName }}, uni barcha foydalanuvchilar " +"uchun oʼchirilishiga olib keladi. Bu harakatni orqaga qaytarib boʼlmaydi. " +"Haqiqatdan ham ushbu panelni orqaga qaytarib boʼlmaslik sharti bilan " +"oʼchirib tashlamoqchimisiz?" + +msgid "Cancel" +msgstr "Bekor qilish" + +msgid "Discard changes" +msgstr "Oʼzgartirishlar bekor qilinsin" + +msgid "" +"This dashboard has unsaved changes. Are you sure you want to leave and " +"discard these unsaved changes?" +msgstr "" + +msgid "No, stay here" +msgstr "Yoʼq, sahifada qolish" + +msgid "Yes, discard changes" +msgstr "" + +msgid "No access" +msgstr "Kirish huquqi mavjud emas" + +msgid "Not supported" +msgstr "" + +msgid "" +"Editing dashboards on small screens is not supported. Resize your screen to " +"return to edit mode." +msgstr "" + +msgid "Allow filtering by all dimensions" +msgstr "" + +msgid "Only allow filtering by selected dimensions" +msgstr "" + +msgid "Dashboard filter settings" +msgstr "" + +msgid "" +"Dashboards can be filtered by dimensions to change\n" +" the data shown. By default, all dimensions are available\n" +" as filters. Alternatively, only selected dimensions can\n" +" be made available on a dashboard." +msgstr "" + +msgid "Available Filters" +msgstr "" + +msgid "Selected Filters" +msgstr "" + +msgid "Confirm" +msgstr "Tasdiqlang" + +msgid "There are no items on this dashboard" +msgstr "Ushbu boshqaruv panelida elementlar yoʼq" + +msgid "Show fewer" +msgstr "Kamroq koʼrsatish" + +msgid "Show more" +msgstr "Koʼproq koʼrsatilsin" + +msgid "Insert" +msgstr "Kiritish" + +msgid "Search for items to add to this dashboard" +msgstr "Ushbu boshqaruv paneliga kiritish uchun elementlarni qidiring" + +msgid "Search for visualizations, reports and more" +msgstr "" + +msgid "Cannot search for dashboard items while offline" +msgstr "" + +msgid "Additional items" +msgstr "Qoʼshimcha elementlar" + +msgid "Text box" +msgstr "Matn joyi" + +msgid "Dashboard layout" +msgstr "Boshqaruv paneli maketi" + +msgid "Freeflow" +msgstr "" + +msgid "Dashboard items can be placed anywhere, at any size." +msgstr "" + +msgid "Fixed columns" +msgstr "" + +msgid "" +"Dashboard items are automatically placed within fixed, horizontal columns. " +"The number of columns can be adjusted." +msgstr "" + +msgid "Number of columns" +msgstr "" + +msgid "Gap size between columns (px)" +msgstr "" + +msgid "" +"Default height only applies to items added to a dashboard, this setting will" +" not change existing items" +msgstr "" + +msgid "Default height for items added to dashboard (rows)" +msgstr "" + +msgid "Save layout" +msgstr "" + +msgid "Dashboard title" +msgstr "Boshqaruv paneli nomlanishi" + +msgid "Dashboard code" +msgstr "" + +msgid "Code can't be longer than 50 characters" +msgstr "" + +msgid "Dashboard description" +msgstr "Boshqaruv paneli tavsifi" + +msgid "Layout" +msgstr "Joylashish tartibi" + +msgid "{{count}} columns" +msgid_plural "{{count}} columns" +msgstr[0] "" + +msgid "Change layout" +msgstr "" + +msgid "Add new items to" +msgstr "" + +msgid "End of dashboard" +msgstr "" + +msgid "Start of dashboard" +msgstr "" + +msgid "Print" +msgstr "Chop etish" + +msgid "dashboard layout" +msgstr "boshqarish paneli maketi" + +msgid "one item per page" +msgstr "bir sahifada bir element" + +msgid "Print Preview" +msgstr "" + +msgid "For best print results" +msgstr "Bosib chiqarishda (printerda) eng yaxshi natijaga erishish" + +msgid "Use Chrome or Edge web browser" +msgstr "Chrome yoki Edge brauzeridan foydalaning" + +msgid "Wait for all dashboard items to load before printing" +msgstr "" +"Bosib chiqarishdan oldin boshqarish paneliga barcha elementlarning " +"yuklanishini kuting" + +msgid "" +"Use A4 landscape paper size, default margin settings and turn on background " +"graphics in the browser print dialog" +msgstr "" + +msgid "Getting started" +msgstr "Ish boshlanganida" + +msgid "Search for and open saved dashboards from the top bar." +msgstr "" + +msgid "" +"Click a dashboard chip to open it. Get back to this screen from the \"More\"" +" menu." +msgstr "" + +msgid "Create a new dashboard with the + button." +msgstr "" + +msgid "Your most viewed dashboards" +msgstr "" + +msgid "No dashboards found. Use the + button to create a new dashboard." +msgstr "" +"Boshqaruv paneli topilmadi. Yangi boshqaruv panelini yaratish uchun + " +"tugmasini bosing." + +msgid "Requested dashboard not found" +msgstr "Soʼralgan boshqaruv paneli topilmadi" + +msgid "{{count}} selected" +msgid_plural "{{count}} selected" +msgstr[0] "" + +msgid "Cannot remove filters while offline" +msgstr "" + +msgid "Removing filters while offline" +msgstr "" + +msgid "" +"Removing this filter while offline will remove all other filters. Do you " +"want to remove all filters on this dashboard?" +msgstr "" + +msgid "No, cancel" +msgstr "Yoʼq, bekor qiling" + +msgid "Yes, remove filters" +msgstr "" + +msgid "The dashboard couldn't be made available offline. Try again." +msgstr "" + +msgid "Failed to unstar the dashboard" +msgstr "" + +msgid "Failed to star the dashboard" +msgstr "" + +msgid "Remove from offline storage" +msgstr "" + +msgid "Make available offline" +msgstr "" + +msgid "Sync offline data now" +msgstr "" + +msgid "Unstar dashboard" +msgstr "Boshqaruv panelidagi yulduzcha oʼchiriladi" + +msgid "Star dashboard" +msgstr "Boshqaruv paneliga yulduzcha oʼrnatiladi" + +msgid "Hide description" +msgstr "Tavsifni berkitish" + +msgid "Show description" +msgstr "Tavsifni koʼrsatish" + +msgid "One item per page" +msgstr "Har bir sahifada bitta element" + +msgid "Close dashboard" +msgstr "" + +msgid "More" +msgstr "Koʼproq" + +msgid "Edit" +msgstr "Tahrirlash" + +msgid "Share" +msgstr "Ulashish" + +msgid "Clear dashboard filters?" +msgstr "" + +msgid "" +"A dashboard's filters can’t be saved offline. Do you want to remove the " +"filters and make this dashboard available offline?" +msgstr "" + +msgid "Yes, clear filters and sync" +msgstr "" + +msgid "No description" +msgstr "Tavsif yoʼq" + +msgid "Add filter" +msgstr "Filtr kiritish" + +msgid "Offline data last updated {{time}}" +msgstr "" + +msgid "Cannot unstar this dashboard while offline" +msgstr "" + +msgid "Cannot star this dashboard while offline" +msgstr "" + +msgid "Loading dashboard – {{name}}" +msgstr "Boshqaruv paneli yuklanmoqda - {{ismi}}" + +msgid "Loading dashboard" +msgstr "" + +msgid "Offline" +msgstr "Offlayn" + +msgid "This dashboard cannot be loaded while offline." +msgstr "" + +msgid "Go to start page" +msgstr "" + +msgid "Load dashboard failed" +msgstr "" + +msgid "This dashboard could not be loaded. Please try again later." +msgstr "" diff --git a/package.json b/package.json index 5dd187c60..f4ab14107 100644 --- a/package.json +++ b/package.json @@ -43,11 +43,8 @@ "validate-push": "CI=true yarn test", "postinstall": "patch-package", "cypress:start": "BROWSER=none yarn start", - "cy:open-live": "cypress_dhis2_api_stub_mode=DISABLED d2-utils-cypress open --appStart 'yarn cypress:start'", - "cy:run-live": "cypress_dhis2_api_stub_mode=DISABLED d2-utils-cypress run --appStart 'yarn cypress:start'", - "cy:open-stub": "cypress_dhis2_api_stub_mode=STUB d2-utils-cypress open --appStart 'yarn cypress:start'", - "cy:run-stub": "cypress_dhis2_api_stub_mode=STUB d2-utils-cypress run --tags '@nonmutating' --appStart 'yarn cypress:start' --record", - "cy:capture": "cypress_dhis2_api_stub_mode=CAPTURE yarn d2-utils-cypress run --appStart 'yarn cypress:start'" + "cy:open": "d2-utils-cypress open --appStart 'yarn cypress:start'", + "cy:run": "d2-utils-cypress run --appStart 'yarn cypress:start'" }, "devDependencies": { "@dhis2/cli-app-scripts": "^10.3.10",