From d5fabd4b1f9d102cf380088220bc69a963aaba8e Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 30 May 2016 20:28:27 +0200 Subject: [PATCH] OO-1807: wording --- .../bc/meta/_i18n/LocalStrings_ar.properties | 8 +------ .../bc/meta/_i18n/LocalStrings_bg.properties | 6 +---- .../bc/meta/_i18n/LocalStrings_de.properties | 3 ++- .../bc/meta/_i18n/LocalStrings_el.properties | 8 +------ .../bc/meta/_i18n/LocalStrings_en.properties | 3 ++- .../bc/meta/_i18n/LocalStrings_es.properties | 6 +---- .../bc/meta/_i18n/LocalStrings_fr.properties | 1 + .../bc/meta/_i18n/LocalStrings_it.properties | 8 +------ .../bc/meta/_i18n/LocalStrings_jp.properties | 8 +------ .../meta/_i18n/LocalStrings_nl_NL.properties | 8 +------ .../bc/meta/_i18n/LocalStrings_pl.properties | 8 +------ .../meta/_i18n/LocalStrings_pt_BR.properties | 1 + .../bc/meta/_i18n/LocalStrings_ru.properties | 1 + .../meta/_i18n/LocalStrings_zh_CN.properties | 7 +----- .../meta/_i18n/LocalStrings_zh_TW.properties | 8 +------ .../org/olat/selenium/page/LoginPage.java | 8 ++++--- .../selenium/page/graphene/OOGraphene.java | 23 +++++++++++-------- 17 files changed, 35 insertions(+), 80 deletions(-) diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ar.properties index 65a9a7a623c..c2faff4432b 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ar.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ar.properties @@ -1,11 +1,5 @@ #Fri Aug 20 17:49:17 CEST 2010 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=\u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641 \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u060C \u064A\u0631\u062C\u0649 \u0625\u0632\u0627\u0644\u0629 \u0623\u064A\u0629 \u0631\u0645\u0648\u0632 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629 \u0645\u062B\u0644 /\u060C \:\u060C... \u0625\u0644\u062E. mf.author=\u0623\u0646\u0634\u0626\u062A \u0628\u0648\u0627\u0633\u0637\u0629 mf.cancel=\u0625\u0644\u063A\u0627\u0621 diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_bg.properties index 2a42f38b996..4bcfa3e4e86 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_bg.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_bg.properties @@ -1,9 +1,5 @@ #Sun Nov 22 16:49:49 CET 2009 - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid mf.author=\u0421\u044A\u0437\u0434\u0430\u0434\u0435\u043D \u043E\u0442 mf.cancel=\u041E\u0442\u043C\u0435\u043D\u0435\u0442\u0435 mf.city=\u041C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties index ea72b9a004f..143e70acfb1 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_de.properties @@ -1,4 +1,5 @@ #Tue Feb 17 19:14:27 CET 2015 +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid external.url=Externer Link zu dieser Ressource file.name.notvalid=Dieser Dateiname enth\u00E4lt unzul\u00E4ssige Zeichen, bitte entfernen Sie alle Sonderzeichen wie /, \:, etc. folder.name.notvalid=Dieser Ordnername enth\u00E4lt unzul\u00E4ssige Zeichen, bitte entfernen Sie alle Sonderzeichen wie /, \:, etc. @@ -14,7 +15,7 @@ mf.error.filename.exists=Ein Objekt mit gleichem Namen existiert bereits. mf.error.filename.invalidchars=Der Name des Objektes enth\u00E4lt ung\u00FCltige Zeichen. mf.file=Datei mf.filename=Dateiname -mf.filename.warning=<i class="o_icon o_icon_warn"> </i> Dieser Dateiname enth\u00E4lt unzul\u00E4ssige Zeichen und die wurden entfernt. +mf.filename.warning=<i class="o_icon o_icon_warn"> </i> Der Dateiname enthielt unzul\u00E4ssige Zeichen. Diese wurden entfernt. mf.header=Metadaten Datei/Ordner mf.language=Sprache mf.lastModified=Datum letzte \u00C4nderung diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_el.properties index 389ce359e49..0dfeab1c5a9 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_el.properties @@ -1,11 +1,5 @@ #Mon Aug 30 12:55:54 CEST 2010 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BC\u03AE \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03BF\u03CD\u03C2 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03C3\u03C4\u03B5 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B5\u03B9\u03B4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2 \u03CC\u03C0\u03C9\u03C2 /, \:, \u03BA\u03C4\u03BB. mf.author=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03B8\u03B7\u03BA\u03B5 \u03B1\u03C0\u03BF mf.cancel=\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7 diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties index aa2ac8587b1..40e0f5c3d98 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_en.properties @@ -1,4 +1,5 @@ #Fri Jan 21 10:14:22 CET 2011 +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid external.url=External link to this resource file.name.notvalid=This file name contains invalid characters. Please remove all special characters such as /, \:, etc. folder.name.notvalid=This folder name contains invalid characters. Please remove all special characters such as /, \:, etc. @@ -14,7 +15,7 @@ mf.error.filename.exists=An object with that name already exists. mf.error.filename.invalidchars=The object's name contains invalid characters. mf.file=File mf.filename=File name -mf.filename.warning=<i class="o_icon o_icon_warn"> </i> This file name contains invalid characters and they were removed. +mf.filename.warning=<i class="o_icon o_icon_warn"> </i> This file name contained invalid characters which were removed. mf.header=Metadata file/folder mf.language=Language mf.lastModified=Last modified\: diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_es.properties index 3e6bc3d2b20..0413d8fe4ea 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_es.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_es.properties @@ -1,9 +1,5 @@ #Thu Oct 22 23:35:25 CEST 2009 - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid mf.author=Creado por mf.cancel=Cancelar mf.city=Ubicaci\u00F3n diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_fr.properties index 75c02da3132..d57df9094d6 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_fr.properties @@ -1,4 +1,5 @@ #Thu May 05 09:57:18 CEST 2016 +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid external.url=Lien externe vers cette ressource file.name.notvalid=Ce nom de fichier contient des caract\u00E8res non permis, veuillez \u00E9liminer tous les caract\u00E8res sp\u00E9ciaux comme /, \:, etc. folder.name.notvalid=Le nom de ce dossier contient des caract\u00E8res d\u00E9conseill\u00E9s. Enlever s'il-vous-pla\u00EEt les caract\u00E8res sp\u00E9ciaux comme /,\: etc. diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_it.properties index e476df3cdc1..3fe65914263 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_it.properties @@ -1,11 +1,5 @@ #Fri Aug 27 13:40:48 CEST 2010 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=Il nome di questo file contiene caratteri non validi, elimini tutti i caratteri speciali come /, \:, ecc. mf.author=Creato via mf.cancel=Interrompere diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_jp.properties index 50a5bb432f0..0f05c538f4b 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_jp.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_jp.properties @@ -1,11 +1,5 @@ #Tue Sep 21 22:41:05 CEST 2010 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=\u30D5\u30A1\u30A4\u30EB\u540D\u306B\u7121\u52B9\u306A\u6587\u5B57\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u300C/\u300D\u300C\:\u300D\u306E\u3088\u3046\u306A\u7279\u5225\u6587\u5B57\u3059\u3079\u3066\u3092\u53D6\u308A\u9664\u3044\u3066\u304F\u3060\u3055\u3044\u3002 mf.author=\u4F5C\u6210\u8005 mf.cancel=\u30AD\u30E3\u30F3\u30BB\u30EB diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_nl_NL.properties index 7d437c73e4c..6462c2f8645 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_nl_NL.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_nl_NL.properties @@ -1,11 +1,5 @@ #Thu Sep 08 16:42:42 CEST 2011 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=Deze bestnadsnaam bevat ongeldige tekens. verwijder a.u.b. alle speciale tekens zoals /, \:, enz. mf.author=Gemaakt door mf.cancel=Afbreken diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pl.properties index c79239f9146..187f5115991 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pl.properties @@ -1,11 +1,5 @@ #Mon Aug 30 10:42:09 CEST 2010 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=Niepoprawna nazwa pliku. Nale\u017Cy usun\u0105\u0107 wszystkie nieprawid\u0142owe znaki. mf.author=Utworzony przez mf.cancel=Anuluj diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pt_BR.properties index e85b5b693c8..d148683c7d5 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,5 @@ #Mon Feb 08 20:06:16 CET 2016 +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid external.url=Link externo para este recurso file.name.notvalid=Por favor traduzir\! O nome do arquivo n\u00E3o \u00E9 v\u00E1lido, por favor, remova quaisquer caracteres inv\u00E1lidos\! Os caracteres inv\u00E1lidos\: non Latin-1, path char, \:, etc... mf.author=Criado por diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ru.properties index 2fe49ab0558..6bee367a776 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ru.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_ru.properties @@ -1,4 +1,5 @@ #Tue Jan 19 16:27:44 CET 2010 +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=\u0418\u043C\u044F \u0444\u0430\u0439\u043B\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B. \u0423\u0434\u0430\u043B\u0438\u0442\u0435 \u0432\u0441\u0435 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0442\u0430\u043A\u0438\u0435 \u043A\u0430\u043A\: \u043D\u0435 \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B, "/", "\:" \u0438 \u0442.\u0434. mf.author=\u0421\u043E\u0437\u0434\u0430\u043D\u043E mf.cancel=\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_CN.properties index 39daa327b43..01642d2b3ae 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_CN.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_CN.properties @@ -1,10 +1,5 @@ #Sun Feb 07 10:24:24 CET 2010 - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=\u8BF7\u7FFB\u8BD1\uFF01\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5\uFF0C\u8BF7\u5220\u9664\u6389\u4E0D\u5408\u6CD5\u7684\u5B57\u7B26\uFF01\u4E0D\u5408\u6CD5\u7684\u5B57\u7B26\u5305\u62EC\uFF1A\u975E\u62C9\u4E01\u5B57\u6BCD-1\uFF0C_,\:,\u7B49\u7B49 mf.author=\u7531\u521B\u5EFA mf.cancel=\u53D6\u6D88 diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_TW.properties index d07864c0cdc..9d680a9be4f 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_TW.properties +++ b/src/main/java/org/olat/core/commons/modules/bc/meta/_i18n/LocalStrings_zh_TW.properties @@ -1,11 +1,5 @@ #Mon Sep 20 15:07:41 CEST 2010 - - - - - - - +cfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid file.name.notvalid=\u8ACB\u7FFB\u8B6F\uFF01\u4E0D\u5408\u6CD5\u7684\u6A94\u6848\u540D\u7A31\uFF0C\u8ACB\u79FB\u9664\u4EFB\u4F55\u4E0D\u5408\u6CD5\u7684\u5B57\u5143\uFF01\u4E0D\u5408\u6CD5\u7684\u5B57\u5143\u5305\u542B\uFF1A\u975E Latin-1\u3001\u8DEF\u5F91\u7B26\u865F\u3001\u5192\u865F(\:)...\u7B49\u3002 mf.author=\u5EFA\u7ACB\u8005 mf.cancel=\u53D6\u6D88 diff --git a/src/test/java/org/olat/selenium/page/LoginPage.java b/src/test/java/org/olat/selenium/page/LoginPage.java index a755b68a057..e2ad4b00758 100644 --- a/src/test/java/org/olat/selenium/page/LoginPage.java +++ b/src/test/java/org/olat/selenium/page/LoginPage.java @@ -47,7 +47,6 @@ public class LoginPage { private static final String footerUserDivXPath = "//div[@id='o_footer_user']"; private static final String acknowledgeCheckboxXPath = "//input[@name='acknowledge_checkbox']"; - private static final By authXPath = By.xpath(footerUserDivXPath); public static final By loginFormBy = By.cssSelector("div.o_login_form"); private static final By authOrDisclaimerXPath = By.xpath(footerUserDivXPath + "|" + acknowledgeCheckboxXPath); private static final By disclaimerXPath = By.xpath(acknowledgeCheckboxXPath); @@ -129,7 +128,9 @@ public class LoginPage { By guestLinkBy = By.xpath("//a[contains(@href,'menu.guest')]"); WebElement guestLink = browser.findElement(guestLinkBy); Graphene.guardHttp(guestLink).click(); - OOGraphene.waitElement(authXPath, browser); + + By footerUserDivBy = By.id("o_footer_user"); + OOGraphene.waitElement(footerUserDivBy, browser); } /** @@ -171,7 +172,8 @@ public class LoginPage { } //wait until the content appears - OOGraphene.waitElement(authXPath, 10, browser); + By footerUserBy = By.cssSelector("#o_footer_user #o_username"); + OOGraphene.waitElement(footerUserBy, 10, browser); return this; } diff --git a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java index b13e0c4e5d4..05dc10b449d 100644 --- a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java +++ b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java @@ -47,7 +47,7 @@ public class OOGraphene { private static final long poolingDuration = 25;//ms private static final long waitTinyDuration = 15;//seconds - private static final By closeBlueBoxButtonBy = By.cssSelector("div.o_alert_info div.o_sel_info_message a.o_alert_close"); + private static final By closeBlueBoxButtonBy = By.cssSelector("div.o_alert_info div.o_sel_info_message a.o_alert_close.o_sel_info_close i.o_icon_close"); private static final By closeModalDialogButtonBy = By.cssSelector("div.modal-dialog div.modal-header button.close"); public static void waitModalDialog(WebDriver browser) { @@ -220,21 +220,24 @@ public class OOGraphene { } catch(Exception e2) { //e.printStackTrace(); } + } catch(ElementNotVisibleException e1) { + try { + waitingALittleLonger(); + clickCloseButton(browser, closeButton); + } catch(Exception e2) { + //e2.printStackTrace(); + } } } } } private static final void clickCloseButton(WebDriver browser, WebElement closeButton) { - try { - closeButton.click(); - Graphene.waitModel(browser) - .withTimeout(1000, TimeUnit.MILLISECONDS) - .pollingEvery(poolingDuration, TimeUnit.MILLISECONDS) - .until(new CloseAlertInfoPredicate()); - } catch (ElementNotVisibleException e) { - //e.printStackTrace(); - } + closeButton.click(); + Graphene.waitModel(browser) + .withTimeout(1000, TimeUnit.MILLISECONDS) + .pollingEvery(poolingDuration, TimeUnit.MILLISECONDS) + .until(new CloseAlertInfoPredicate()); } public static final void closeModalDialogWindow(WebDriver browser) { -- GitLab