diff --git a/README.md b/README.md index 2acf32cc..f76af7d1 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Getting Started Requirements ------------ -The primary *ResearchKit framework* codebase supports *iOS* and requires *Xcode 7.0* or newer. The +The primary *ResearchKit framework* codebase supports *iOS* and requires *Xcode 8.0* or newer. The *ResearchKit framework* has a *Base SDK* version of *8.0*, meaning that apps using the *ResearchKit framework* can run on devices with *iOS 8.0* or newer. diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 276802a5..14540282 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,5 +1,73 @@ # ResearchKit Release Notes +## ResearchKit 1.4 Release Notes + +*ResearchKit 1.4* supports *iOS* and requires *Xcode 8.0* or newer. The minimum supported *Base SDK* is *8.0*. + +In addition to general stabiltiy and performance improvements, *ResearchKit 1.4* includes the following new features and enhancements. + +- **New Active Task** + + - **Hand Tremor Task** + + *Contributed by [Shannon Young](https://github.com/syoung-smallwisdom).* + + The *Hand Tremor Task* asks the participant to hold the device with their most affected hand in various positions while accelerometer and motion data is captured. + + - **Walk Back and Forth Task** + + *Contributed by [Shannon Young](https://github.com/syoung-smallwisdom).* + + The *Walk Back and Forth Task* addresses the concern of researchers/participants who have difficulty locating an unobstructed path for 20 steps. + + Instructs users to walk and turn in a full circle, allowing the tests to be conducted in a smaller space. + +- **New Steps** + + - **Video Capture Step** + + *Contributed by [Apple Inc](https://github.com/researchkit).* + + The *Video Capture Step* provides a step to be used to record video. + + The step can be used as part of a survey to capture video respones as well. + + - **Review Step** + + *Contributed by [Oliver Schäfer](https://github.com/oliverschaefer).* + + The *Review Step* allows a participant to review and modify their answers to a survey. + + The step can be used in the middle of a survey, at the end of a survey, or a standalone module. + + - **Signature Step** + + *Contributed by [Oliver Schäfer](https://github.com/oliverschaefer).* + + The *Signature Step* provides an interface for a participant to sign their name. + + The step can be used for handwriting detection or simply to sign a document. + + - **Table Step** + + *Contributed by [Shannon Young](https://github.com/syoung-smallwisdom).* + + The *Table Step* provides a way to neatly display data in a table. + +- **Other Improvements** + + - **Data Collection Module** + + *Contributed by [Apple Inc](https://github.com/researchkit).* + + The *Data Collection Module* makes it even easier to aggregate data from HealthKit and device sensors. + + - **Tapping Test** + + *Contributed by [Michał Zaborowski](https://github.com/m1entus).* + + The *Tapping Test* is updated to include tap duration as part of the result. + ## ResearchKit 1.3 Release Notes diff --git a/ResearchKit.podspec b/ResearchKit.podspec index 91e8ebf9..cc6ea6b6 100644 --- a/ResearchKit.podspec +++ b/ResearchKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ResearchKit' - s.version = '1.3.0' + s.version = '1.3.1' s.summary = 'ResearchKit is an open source software framework that makes it easy to create apps for medical research or for other research projects.' s.homepage = 'https://www.github.com/ResearchKit/ResearchKit' s.documentation_url = 'http://researchkit.github.io/docs/' diff --git a/ResearchKit.xcodeproj/project.pbxproj b/ResearchKit.xcodeproj/project.pbxproj index abf1107d..761686a5 100644 --- a/ResearchKit.xcodeproj/project.pbxproj +++ b/ResearchKit.xcodeproj/project.pbxproj @@ -82,6 +82,14 @@ 248604061B4C98760010C8A0 /* ORKAnswerFormatTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 248604051B4C98760010C8A0 /* ORKAnswerFormatTests.m */; }; 24898B0D1B7186C000B0E7E7 /* ORKScaleRangeImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 24898B0B1B7186C000B0E7E7 /* ORKScaleRangeImageView.h */; }; 24898B0E1B7186C000B0E7E7 /* ORKScaleRangeImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24898B0C1B7186C000B0E7E7 /* ORKScaleRangeImageView.m */; }; + 2489F7AF1D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2489F7A71D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.h */; }; + 2489F7B01D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2489F7A81D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.m */; }; + 2489F7B11D65214D008DEF20 /* ORKVideoCaptureStep.h in Headers */ = {isa = PBXBuildFile; fileRef = 2489F7A91D65214D008DEF20 /* ORKVideoCaptureStep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2489F7B21D65214D008DEF20 /* ORKVideoCaptureStep.m in Sources */ = {isa = PBXBuildFile; fileRef = 2489F7AA1D65214D008DEF20 /* ORKVideoCaptureStep.m */; }; + 2489F7B31D65214D008DEF20 /* ORKVideoCaptureStepViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2489F7AB1D65214D008DEF20 /* ORKVideoCaptureStepViewController.h */; }; + 2489F7B41D65214D008DEF20 /* ORKVideoCaptureStepViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2489F7AC1D65214D008DEF20 /* ORKVideoCaptureStepViewController.m */; }; + 2489F7B51D65214D008DEF20 /* ORKVideoCaptureView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2489F7AD1D65214D008DEF20 /* ORKVideoCaptureView.h */; }; + 2489F7B61D65214D008DEF20 /* ORKVideoCaptureView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2489F7AE1D65214D008DEF20 /* ORKVideoCaptureView.m */; }; 249F44E51BCD9EAC0000D57E /* ORKFormStepViewController_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 249F44E31BCD9EAC0000D57E /* ORKFormStepViewController_Internal.h */; }; 24A4DA101B8D0F21009C797A /* ORKPasscodeStepView.h in Headers */ = {isa = PBXBuildFile; fileRef = 24A4DA0E1B8D0F21009C797A /* ORKPasscodeStepView.h */; }; 24A4DA111B8D0F21009C797A /* ORKPasscodeStepView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A4DA0F1B8D0F21009C797A /* ORKPasscodeStepView.m */; }; @@ -139,6 +147,18 @@ 865EA1691ABA1AA10037C68E /* ORKPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 865EA1671ABA1AA10037C68E /* ORKPicker.m */; }; 865EA16C1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = 865EA16A1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.h */; }; 865EA16D1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 865EA16B1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.m */; }; + 866DA51F1D63D04700C9AF3F /* ORKCollector_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA5131D63D04700C9AF3F /* ORKCollector_Internal.h */; }; + 866DA5201D63D04700C9AF3F /* ORKCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA5141D63D04700C9AF3F /* ORKCollector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 866DA5211D63D04700C9AF3F /* ORKCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 866DA5151D63D04700C9AF3F /* ORKCollector.m */; }; + 866DA5221D63D04700C9AF3F /* ORKDataCollectionManager_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA5161D63D04700C9AF3F /* ORKDataCollectionManager_Internal.h */; }; + 866DA5231D63D04700C9AF3F /* ORKDataCollectionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA5171D63D04700C9AF3F /* ORKDataCollectionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 866DA5241D63D04700C9AF3F /* ORKDataCollectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 866DA5181D63D04700C9AF3F /* ORKDataCollectionManager.m */; }; + 866DA5251D63D04700C9AF3F /* ORKHealthSampleQueryOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA5191D63D04700C9AF3F /* ORKHealthSampleQueryOperation.h */; }; + 866DA5261D63D04700C9AF3F /* ORKHealthSampleQueryOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 866DA51A1D63D04700C9AF3F /* ORKHealthSampleQueryOperation.m */; }; + 866DA5271D63D04700C9AF3F /* ORKMotionActivityQueryOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA51B1D63D04700C9AF3F /* ORKMotionActivityQueryOperation.h */; }; + 866DA5281D63D04700C9AF3F /* ORKMotionActivityQueryOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 866DA51C1D63D04700C9AF3F /* ORKMotionActivityQueryOperation.m */; }; + 866DA5291D63D04700C9AF3F /* ORKOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 866DA51D1D63D04700C9AF3F /* ORKOperation.h */; }; + 866DA52A1D63D04700C9AF3F /* ORKOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 866DA51E1D63D04700C9AF3F /* ORKOperation.m */; }; 866F86011A96CBF3007B282C /* ORKSurveyAnswerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 866F86001A96CBF3007B282C /* ORKSurveyAnswerCell.m */; }; 86AD910A1AB7AD1E00361FEB /* ORKNavigationContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AD91081AB7AD1E00361FEB /* ORKNavigationContainerView.h */; }; 86AD910B1AB7AD1E00361FEB /* ORKNavigationContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 86AD91091AB7AD1E00361FEB /* ORKNavigationContainerView.m */; }; @@ -609,6 +629,14 @@ 248604051B4C98760010C8A0 /* ORKAnswerFormatTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKAnswerFormatTests.m; sourceTree = ""; }; 24898B0B1B7186C000B0E7E7 /* ORKScaleRangeImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKScaleRangeImageView.h; sourceTree = ""; }; 24898B0C1B7186C000B0E7E7 /* ORKScaleRangeImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKScaleRangeImageView.m; sourceTree = ""; }; + 2489F7A71D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKVideoCaptureCameraPreviewView.h; sourceTree = ""; }; + 2489F7A81D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKVideoCaptureCameraPreviewView.m; sourceTree = ""; }; + 2489F7A91D65214D008DEF20 /* ORKVideoCaptureStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKVideoCaptureStep.h; sourceTree = ""; }; + 2489F7AA1D65214D008DEF20 /* ORKVideoCaptureStep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKVideoCaptureStep.m; sourceTree = ""; }; + 2489F7AB1D65214D008DEF20 /* ORKVideoCaptureStepViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKVideoCaptureStepViewController.h; sourceTree = ""; }; + 2489F7AC1D65214D008DEF20 /* ORKVideoCaptureStepViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKVideoCaptureStepViewController.m; sourceTree = ""; }; + 2489F7AD1D65214D008DEF20 /* ORKVideoCaptureView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKVideoCaptureView.h; sourceTree = ""; }; + 2489F7AE1D65214D008DEF20 /* ORKVideoCaptureView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKVideoCaptureView.m; sourceTree = ""; }; 249F44E31BCD9EAC0000D57E /* ORKFormStepViewController_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKFormStepViewController_Internal.h; sourceTree = ""; }; 24A4DA0E1B8D0F21009C797A /* ORKPasscodeStepView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKPasscodeStepView.h; sourceTree = ""; }; 24A4DA0F1B8D0F21009C797A /* ORKPasscodeStepView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKPasscodeStepView.m; sourceTree = ""; }; @@ -667,6 +695,18 @@ 865EA1671ABA1AA10037C68E /* ORKPicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKPicker.m; sourceTree = ""; }; 865EA16A1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKSurveyAnswerCellForPicker.h; sourceTree = ""; }; 865EA16B1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ORKSurveyAnswerCellForPicker.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 866DA5131D63D04700C9AF3F /* ORKCollector_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKCollector_Internal.h; sourceTree = ""; }; + 866DA5141D63D04700C9AF3F /* ORKCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKCollector.h; sourceTree = ""; }; + 866DA5151D63D04700C9AF3F /* ORKCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKCollector.m; sourceTree = ""; }; + 866DA5161D63D04700C9AF3F /* ORKDataCollectionManager_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKDataCollectionManager_Internal.h; sourceTree = ""; }; + 866DA5171D63D04700C9AF3F /* ORKDataCollectionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKDataCollectionManager.h; sourceTree = ""; }; + 866DA5181D63D04700C9AF3F /* ORKDataCollectionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKDataCollectionManager.m; sourceTree = ""; }; + 866DA5191D63D04700C9AF3F /* ORKHealthSampleQueryOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKHealthSampleQueryOperation.h; sourceTree = ""; }; + 866DA51A1D63D04700C9AF3F /* ORKHealthSampleQueryOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKHealthSampleQueryOperation.m; sourceTree = ""; }; + 866DA51B1D63D04700C9AF3F /* ORKMotionActivityQueryOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKMotionActivityQueryOperation.h; sourceTree = ""; }; + 866DA51C1D63D04700C9AF3F /* ORKMotionActivityQueryOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKMotionActivityQueryOperation.m; sourceTree = ""; }; + 866DA51D1D63D04700C9AF3F /* ORKOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKOperation.h; sourceTree = ""; }; + 866DA51E1D63D04700C9AF3F /* ORKOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKOperation.m; sourceTree = ""; }; 866F86001A96CBF3007B282C /* ORKSurveyAnswerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKSurveyAnswerCell.m; sourceTree = ""; }; 86AD91081AB7AD1E00361FEB /* ORKNavigationContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ORKNavigationContainerView.h; sourceTree = ""; }; 86AD91091AB7AD1E00361FEB /* ORKNavigationContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ORKNavigationContainerView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -1248,6 +1288,21 @@ name = Account; sourceTree = ""; }; + 2489F7A61D65213D008DEF20 /* Video Capture Step */ = { + isa = PBXGroup; + children = ( + 2489F7A91D65214D008DEF20 /* ORKVideoCaptureStep.h */, + 2489F7AA1D65214D008DEF20 /* ORKVideoCaptureStep.m */, + 2489F7AB1D65214D008DEF20 /* ORKVideoCaptureStepViewController.h */, + 2489F7AC1D65214D008DEF20 /* ORKVideoCaptureStepViewController.m */, + 2489F7A71D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.h */, + 2489F7A81D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.m */, + 2489F7AD1D65214D008DEF20 /* ORKVideoCaptureView.h */, + 2489F7AE1D65214D008DEF20 /* ORKVideoCaptureView.m */, + ); + name = "Video Capture Step"; + sourceTree = ""; + }; 24A4DA091B8D0CC8009C797A /* Passcode Step */ = { isa = PBXGroup; children = ( @@ -1415,6 +1470,25 @@ path = Accessibility; sourceTree = ""; }; + 866DA5121D63D01C00C9AF3F /* DataCollection */ = { + isa = PBXGroup; + children = ( + 866DA5131D63D04700C9AF3F /* ORKCollector_Internal.h */, + 866DA5141D63D04700C9AF3F /* ORKCollector.h */, + 866DA5151D63D04700C9AF3F /* ORKCollector.m */, + 866DA5161D63D04700C9AF3F /* ORKDataCollectionManager_Internal.h */, + 866DA5171D63D04700C9AF3F /* ORKDataCollectionManager.h */, + 866DA5181D63D04700C9AF3F /* ORKDataCollectionManager.m */, + 866DA5191D63D04700C9AF3F /* ORKHealthSampleQueryOperation.h */, + 866DA51A1D63D04700C9AF3F /* ORKHealthSampleQueryOperation.m */, + 866DA51B1D63D04700C9AF3F /* ORKMotionActivityQueryOperation.h */, + 866DA51C1D63D04700C9AF3F /* ORKMotionActivityQueryOperation.m */, + 866DA51D1D63D04700C9AF3F /* ORKOperation.h */, + 866DA51E1D63D04700C9AF3F /* ORKOperation.m */, + ); + name = DataCollection; + sourceTree = ""; + }; 86B623AF19520B770074CD3C /* ResearchKit */ = { isa = PBXGroup; children = ( @@ -1467,6 +1541,7 @@ B12EFF341AB2111200A80147 /* Step */, B12EFF331AB2110300A80147 /* Task */, B12EFF321AB2106F00A80147 /* UIKitCategories */, + 866DA5121D63D01C00C9AF3F /* DataCollection */, 24B3535D1BB21137009ED6F8 /* Utilities */, ); path = Common; @@ -1639,6 +1714,7 @@ B12EFF361AB2117B00A80147 /* Question Step */, B12EFF3C1AB211FB00A80147 /* Form Step */, D44239761AF17EE700559D96 /* Image Capture Step */, + 2489F7A61D65213D008DEF20 /* Video Capture Step */, 24A4DA091B8D0CC8009C797A /* Passcode Step */, FF5CA60F1D2C2630001660A3 /* Table Step */, BF9D62C41BD244C4000AA6A7 /* Wait Step */, @@ -2354,6 +2430,7 @@ 86C40D3C1A8D7C5C00081FAC /* ORKImageChoiceLabel.h in Headers */, BC4194291AE8453A00073D6B /* ORKObserver.h in Headers */, 10FF9AD31B79F5EA00ECB5B4 /* ORKHolePegTestRemovePegView.h in Headers */, + 866DA5201D63D04700C9AF3F /* ORKCollector.h in Headers */, BF9155AB1BDE8DA9007FA459 /* ORKWaitStepViewController.h in Headers */, BF9155A91BDE8DA9007FA459 /* ORKWaitStepView.h in Headers */, 86C40C661A8D7C5C00081FAC /* CMAccelerometerData+ORKJSONDictionary.h in Headers */, @@ -2373,6 +2450,7 @@ 86C40C221A8D7C5C00081FAC /* ORKCountdownStep.h in Headers */, 86C40DB61A8D7C5C00081FAC /* ORKSurveyAnswerCellForText.h in Headers */, 86C40E281A8D7C5C00081FAC /* ORKSignatureView.h in Headers */, + 2489F7AF1D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.h in Headers */, BCB6E65D1B7D534C000D5B34 /* ORKGraphChartView_Internal.h in Headers */, 86C40C8C1A8D7C5C00081FAC /* ORKActiveStepViewController.h in Headers */, 618DA0541A93D0D600E63AA8 /* UIView+ORKAccessibility.h in Headers */, @@ -2402,6 +2480,7 @@ 86C40D981A8D7C5C00081FAC /* ORKStepViewController_Internal.h in Headers */, 86B89ABB1AB3BECC001626A4 /* ORKStepHeaderView.h in Headers */, FF36A49D1D1A15FC00DE8470 /* ORKTableStepViewController.h in Headers */, + 2489F7B51D65214D008DEF20 /* ORKVideoCaptureView.h in Headers */, D42FEFB81AF7557000A124F8 /* ORKImageCaptureView.h in Headers */, 10FF9ADB1B7BA78400ECB5B4 /* ORKOrderedTask_Private.h in Headers */, 86C40D1A1A8D7C5C00081FAC /* ORKFormItem_Internal.h in Headers */, @@ -2419,6 +2498,7 @@ 865EA16C1ABA1BE20037C68E /* ORKSurveyAnswerCellForPicker.h in Headers */, 86C40C121A8D7C5C00081FAC /* ORKActiveStepQuantityView.h in Headers */, 86C40CCC1A8D7C5C00081FAC /* ORKImageSelectionView.h in Headers */, + 866DA5251D63D04700C9AF3F /* ORKHealthSampleQueryOperation.h in Headers */, 2441034F1B966D4C00EEAB0C /* ORKPasscodeViewController.h in Headers */, B11C549F1A9EF4A700265E61 /* ORKConsentSharingStepViewController.h in Headers */, BC4A213F1C85FC0000BFC271 /* ORKBarGraphChartView.h in Headers */, @@ -2436,7 +2516,9 @@ 86C40DD21A8D7C5C00081FAC /* ORKTextButton.h in Headers */, 86C40CD41A8D7C5C00081FAC /* ORKTableContainerView.h in Headers */, 86C40D0E1A8D7C5C00081FAC /* ORKCustomStepView_Internal.h in Headers */, + 866DA51F1D63D04700C9AF3F /* ORKCollector_Internal.h in Headers */, 86C40CF21A8D7C5C00081FAC /* ORKBodyLabel.h in Headers */, + 866DA5271D63D04700C9AF3F /* ORKMotionActivityQueryOperation.h in Headers */, 106FF2B41B71F18E004EACF2 /* ORKHolePegTestPlaceHoleView.h in Headers */, 86C40D921A8D7C5C00081FAC /* ORKStep_Private.h in Headers */, 86C40CC41A8D7C5C00081FAC /* ORKCompletionStepViewController.h in Headers */, @@ -2452,6 +2534,7 @@ FA7A9D331B0843A9005A2BEA /* ORKConsentSignatureFormatter.h in Headers */, 86C40C5A1A8D7C5C00081FAC /* ORKWalkingTaskStep.h in Headers */, BC1C032C1CA301E300869355 /* ORKHeightPicker.h in Headers */, + 866DA5231D63D04700C9AF3F /* ORKDataCollectionManager.h in Headers */, 86C40E361A8D7C5C00081FAC /* ORKVisualConsentTransitionAnimator.h in Headers */, 86AD910D1AB7AE4100361FEB /* ORKNavigationContainerView_Internal.h in Headers */, 2433C9E31B9A506F0052D375 /* ORKKeychainWrapper.h in Headers */, @@ -2507,6 +2590,7 @@ 86C40D301A8D7C5C00081FAC /* ORKHealthAnswerFormat.h in Headers */, 86C40C261A8D7C5C00081FAC /* ORKCountdownStepViewController.h in Headers */, 861D2AF01B8409D9008C4CD0 /* ORKTimedWalkContentView.h in Headers */, + 2489F7B31D65214D008DEF20 /* ORKVideoCaptureStepViewController.h in Headers */, 86C40E0C1A8D7C5C00081FAC /* ORKConsentReviewStepViewController.h in Headers */, 86C40C321A8D7C5C00081FAC /* ORKFitnessStepViewController.h in Headers */, FF5CA6121D2C2670001660A3 /* ORKTableStep.h in Headers */, @@ -2556,11 +2640,14 @@ 10864C9E1B27146B000F4158 /* ORKPSATStep.h in Headers */, 86C40D6E1A8D7C5C00081FAC /* ORKResult_Private.h in Headers */, 86C40D161A8D7C5C00081FAC /* ORKErrors.h in Headers */, + 866DA5291D63D04700C9AF3F /* ORKOperation.h in Headers */, 861D11B51AA7D073003C98A7 /* ORKTextChoiceCellGroup.h in Headers */, 24BC5CEE1BC345D900846B43 /* ORKLoginStep.h in Headers */, 147503B91AEE807C004B17F3 /* ORKToneAudiometryStep.h in Headers */, 106FF2A21B665B86004EACF2 /* ORKHolePegTestPlaceStepViewController.h in Headers */, 24A4DA101B8D0F21009C797A /* ORKPasscodeStepView.h in Headers */, + 86C40C9A1A8D7C5C00081FAC /* ORKDataLogger_Private.h in Headers */, + 2489F7B11D65214D008DEF20 /* ORKVideoCaptureStep.h in Headers */, 861D11AD1AA7951F003C98A7 /* ORKChoiceAnswerFormatHelper.h in Headers */, 86C40C461A8D7C5C00081FAC /* ORKSpatialSpanMemoryStepViewController.h in Headers */, 86C40C521A8D7C5C00081FAC /* ORKTappingIntervalStep.h in Headers */, @@ -2568,6 +2655,7 @@ 86C40DFE1A8D7C5C00081FAC /* ORKConsentDocument.h in Headers */, D442397D1AF17F7600559D96 /* ORKImageCaptureStepViewController.h in Headers */, 86C40C4A1A8D7C5C00081FAC /* ORKSpatialSpanTargetView.h in Headers */, + 866DA5221D63D04700C9AF3F /* ORKDataCollectionManager_Internal.h in Headers */, 86C40C1A1A8D7C5C00081FAC /* ORKAudioStep.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2620,7 +2708,7 @@ attributes = { CLASSPREFIX = ORK; LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = researchkit.org; TargetAttributes = { 86CC8E991AC09332001CCD89 = { @@ -2758,7 +2846,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ ! -x /usr/local/bin/appledoc ]; then\n echo \"error: appledoc is required for building ResearchKit's documentation. See http://appledoc.gentlebytes.com\" 1>&2\n exit 1\nfi\n\n/usr/local/bin/appledoc --print-settings --publish-docset --install-docset --output \"${BUILT_PRODUCTS_DIR}/docs/\" --include \"docs/ActiveTasks\" --include \"docs/InformedConsent\" --include \"docs/Overview\" --include \"docs/Survey\" --include \"docs/Charts\" --ignore \"docs/templates\" --templates \"docs/templates\" \"${BUILT_PRODUCTS_DIR}/ResearchKit.framework\" \"docs\"\n\necho \"note: Opening documentation in browser...\"\nopen \"$HOME/Library/Developer/Shared/Documentation/DocSets/org.researchkit.ResearchKit.docset/Contents/Resources/Documents/index.html\""; + shellScript = "if [ ! -x /usr/local/bin/appledoc ]; then\n echo \"error: appledoc is required for building ResearchKit's documentation. See http://appledoc.gentlebytes.com\" 1>&2\n exit 1\nfi\n\n/usr/local/bin/appledoc --print-settings --publish-docset --install-docset --output \"${BUILT_PRODUCTS_DIR}/docs/\" --include \"docs/ActiveTasks\" --include \"docs/InformedConsent\" --include \"docs/Overview\" --include \"docs/Survey\" --include \"docs/ChartsAndGraphs\" --include \"docs/Utility\" --include \"docs/Account\" --ignore \"docs/templates\" --templates \"docs/templates\" \"${BUILT_PRODUCTS_DIR}/ResearchKit.framework\" \"docs\"\n\necho \"note: Opening documentation in browser...\"\nopen \"$HOME/Library/Developer/Shared/Documentation/DocSets/org.researchkit.ResearchKit.docset/Contents/Resources/Documents/index.html\""; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -2806,14 +2894,17 @@ 86C40D4C1A8D7C5C00081FAC /* ORKLabel.m in Sources */, 86C40C9E1A8D7C5C00081FAC /* ORKDeviceMotionRecorder.m in Sources */, 86C40D961A8D7C5C00081FAC /* ORKStepViewController.m in Sources */, + 2489F7B21D65214D008DEF20 /* ORKVideoCaptureStep.m in Sources */, 86C40DF81A8D7C5C00081FAC /* ORKSignatureStepViewController.m in Sources */, BCB6E6531B7D533B000D5B34 /* ORKPieChartLegendCell.m in Sources */, + 866DA52A1D63D04700C9AF3F /* ORKOperation.m in Sources */, 86C40D8C1A8D7C5C00081FAC /* ORKSkin.m in Sources */, 86C40D221A8D7C5C00081FAC /* ORKFormStep.m in Sources */, 10FF9ACC1B79F22900ECB5B4 /* ORKHolePegTestRemoveStepViewController.m in Sources */, 86C40CD61A8D7C5C00081FAC /* ORKTableContainerView.m in Sources */, 2429D5731BBB5397003A512F /* ORKRegistrationStep.m in Sources */, 257FCE201B4D14E50001EF06 /* ORKTowerOfHanoiTowerView.m in Sources */, + 2489F7B61D65214D008DEF20 /* ORKVideoCaptureView.m in Sources */, 861D11AE1AA7951F003C98A7 /* ORKChoiceAnswerFormatHelper.m in Sources */, 106FF2AB1B690FD7004EACF2 /* ORKHolePegTestPlacePegView.m in Sources */, BF91559D1BDE8D7D007FA459 /* ORKReviewStep.m in Sources */, @@ -2829,6 +2920,7 @@ 86C40C801A8D7C5C00081FAC /* ORKActiveStep.m in Sources */, 86C40D721A8D7C5C00081FAC /* ORKRoundTappingButton.m in Sources */, 86C40E2A1A8D7C5C00081FAC /* ORKSignatureView.m in Sources */, + 866DA5281D63D04700C9AF3F /* ORKMotionActivityQueryOperation.m in Sources */, BCFF24BD1B0798D10044EC35 /* ORKResultPredicate.m in Sources */, 106FF2B51B71F18E004EACF2 /* ORKHolePegTestPlaceHoleView.m in Sources */, 106FF2A31B665B86004EACF2 /* ORKHolePegTestPlaceStepViewController.m in Sources */, @@ -2858,6 +2950,7 @@ 10FF9AD01B79F5CE00ECB5B4 /* ORKHolePegTestRemoveContentView.m in Sources */, 10FF9AD41B79F5EA00ECB5B4 /* ORKHolePegTestRemovePegView.m in Sources */, 618DA0561A93D0D600E63AA8 /* UIView+ORKAccessibility.m in Sources */, + 866DA5211D63D04700C9AF3F /* ORKCollector.m in Sources */, BC4A21401C85FC0000BFC271 /* ORKBarGraphChartView.m in Sources */, 86C40D3A1A8D7C5C00081FAC /* ORKHTMLPDFWriter.m in Sources */, 865EA1691ABA1AA10037C68E /* ORKPicker.m in Sources */, @@ -2878,6 +2971,7 @@ 147503BC1AEE807C004B17F3 /* ORKToneAudiometryStepViewController.m in Sources */, 86AD910B1AB7AD1E00361FEB /* ORKNavigationContainerView.m in Sources */, 865EA1631AB8DF750037C68E /* ORKDateTimePicker.m in Sources */, + 866DA5241D63D04700C9AF3F /* ORKDataCollectionManager.m in Sources */, 86C40C781A8D7C5C00081FAC /* HKSample+ORKJSONDictionary.m in Sources */, 86C40D421A8D7C5C00081FAC /* ORKInstructionStep.m in Sources */, 86C40C2C1A8D7C5C00081FAC /* ORKFitnessContentView.m in Sources */, @@ -2915,6 +3009,7 @@ BF9155AA1BDE8DA9007FA459 /* ORKWaitStepView.m in Sources */, 86C40D261A8D7C5C00081FAC /* ORKFormStepViewController.m in Sources */, BC5FAF851C6901A200057CF1 /* ORKChartTypes.m in Sources */, + 866DA5261D63D04700C9AF3F /* ORKHealthSampleQueryOperation.m in Sources */, FF5CA6131D2C2670001660A3 /* ORKTableStep.m in Sources */, 86C40C8A1A8D7C5C00081FAC /* ORKActiveStepTimerView.m in Sources */, 86AD91111AB7B8A600361FEB /* ORKActiveStepView.m in Sources */, @@ -2983,6 +3078,7 @@ B11C549B1A9EEF8800265E61 /* ORKConsentSharingStep.m in Sources */, 86C40DE01A8D7C5C00081FAC /* ORKVerticalContainerView.m in Sources */, BCD192EC1B81245500FCC08A /* ORKPieChartTitleTextView.m in Sources */, + 2489F7B41D65214D008DEF20 /* ORKVideoCaptureStepViewController.m in Sources */, 861D2AF71B843968008C4CD0 /* ORKCompletionStepViewController.m in Sources */, BCB6E65F1B7D534C000D5B34 /* ORKGraphChartView.m in Sources */, 24BC5CEF1BC345D900846B43 /* ORKLoginStep.m in Sources */, @@ -2990,6 +3086,7 @@ 86C40D661A8D7C5C00081FAC /* ORKQuestionStepViewController.m in Sources */, 86C40DF41A8D7C5C00081FAC /* ORKConsentReviewController.m in Sources */, 242C9E121BBE06DE0088B7F4 /* ORKVerificationStepView.m in Sources */, + 2489F7B01D65214D008DEF20 /* ORKVideoCaptureCameraPreviewView.m in Sources */, 147503BA1AEE807C004B17F3 /* ORKToneAudiometryStep.m in Sources */, FA7A9D301B083DD3005A2BEA /* ORKConsentSectionFormatter.m in Sources */, 86C40D2A1A8D7C5C00081FAC /* ORKFormTextView.m in Sources */, @@ -3077,6 +3174,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -3087,10 +3185,13 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -3115,6 +3216,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -3125,9 +3227,12 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -3146,9 +3251,9 @@ 86CC8EA41AC09332001CCD89 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_WARN_UNREACHABLE_CODE = YES; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -3169,10 +3274,10 @@ 86CC8EA51AC09332001CCD89 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_WARN_UNREACHABLE_CODE = YES; COPY_PHASE_STRIP = NO; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -3207,7 +3312,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "$(SRCROOT)/ResearchKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = ResearchKit/module.modulemap; MTL_ENABLE_DEBUG_INFO = YES; @@ -3216,6 +3321,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -3238,7 +3344,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "$(SRCROOT)/ResearchKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = ResearchKit/module.modulemap; MTL_ENABLE_DEBUG_INFO = NO; @@ -3246,6 +3352,8 @@ PRODUCT_NAME = ResearchKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/ResearchKit.xcodeproj/xcshareddata/xcschemes/ResearchKit.xcscheme b/ResearchKit.xcodeproj/xcshareddata/xcschemes/ResearchKit.xcscheme index bc63f129..b5ace2f1 100644 --- a/ResearchKit.xcodeproj/xcshareddata/xcschemes/ResearchKit.xcscheme +++ b/ResearchKit.xcodeproj/xcshareddata/xcschemes/ResearchKit.xcscheme @@ -1,6 +1,6 @@ _alertThreshold)) || _failed; + + if (_alertLabel.hidden && show) { + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, _alertLabel.text); + } _alertLabel.hidden = !show; } @@ -385,11 +389,9 @@ static const CGFloat ValueLineMargin = 1.5; } - (NSString *)accessibilityLabel { - if (_alertLabel.isHidden) { - return _timerLabel.accessibilityLabel; - } - - return ORKAccessibilityStringForVariables(_timerLabel.accessibilityLabel, _alertLabel.accessibilityLabel); + NSString *timerAxString = _timerLabel.isHidden ? nil : _timerLabel.accessibilityLabel; + NSString *alertAxString = _alertLabel.isHidden ? nil : _alertLabel.accessibilityLabel; + return ORKAccessibilityStringForVariables(ORKLocalizedString(@"AX_AUDIO_BAR_GRAPH", nil), timerAxString, alertAxString); } - (UIAccessibilityTraits)accessibilityTraits { diff --git a/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.h b/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.h index d7578cd8..53d89a52 100644 --- a/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.h +++ b/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.h @@ -43,7 +43,7 @@ ORK_CLASS_AVAILABLE @param audioLevelStepIdentifier The identifier of the step with the audio file to check. @param destinationStepIdentifier The identifier of the destination step if audio test passes. - + @param recordingSettings Use key AVNumberOfChannelsKey to sepcify the number of recording channels. @return A audio level step navigation rule. */ - (instancetype)initWithAudioLevelStepIdentifier:(NSString *)audioLevelStepIdentifier diff --git a/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.m b/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.m index e5c258fb..9dd63030 100644 --- a/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.m +++ b/ResearchKit/ActiveTasks/ORKAudioLevelNavigationRule.m @@ -135,8 +135,7 @@ Float32 const VolumeClamp = 60.0; return self.destinationStepIdentifier; } -- (BOOL)checkAudioLevelFromSoundFile:(NSURL *)fileURL -{ +- (BOOL)checkAudioLevelFromSoundFile:(NSURL *)fileURL { // Setup reader AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:fileURL options:nil]; if (urlAsset.tracks.count == 0) { diff --git a/ResearchKit/ActiveTasks/ORKDataLogger.h b/ResearchKit/ActiveTasks/ORKDataLogger.h index e1ca49d7..09d4992f 100644 --- a/ResearchKit/ActiveTasks/ORKDataLogger.h +++ b/ResearchKit/ActiveTasks/ORKDataLogger.h @@ -70,6 +70,7 @@ NS_ASSUME_NONNULL_BEGIN @optional /** Tells the delegate that the maximum current log file lifetime changed. + @param dataLogger Source of this event. */ - (void)dataLoggerThresholdsDidChange:(ORKDataLogger *)dataLogger; diff --git a/ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m b/ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m index df6ccfd1..cc7a01d7 100644 --- a/ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m +++ b/ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m @@ -30,12 +30,10 @@ #import "ORKHealthQuantityTypeRecorder.h" - -#import "ORKDataLogger.h" - -#import "ORKRecorder_Internal.h" - #import "ORKHelpers_Internal.h" +#import "ORKDataLogger.h" +#import "ORKRecorder_Private.h" +#import "ORKRecorder_Internal.h" #import "HKSample+ORKJSONDictionary.h" @@ -148,22 +146,22 @@ static const NSInteger _HealthAnchoredQueryLimit = 100; } NSAssert(_samplePredicate != nil, @"Sample predicate should be non-nil if recording"); - ORKWeakTypeOf(self) weakSelf = self; + __weak typeof(self) weakSelf = self; void (^handleResults)(NSArray <__kindof HKSample *> *, HKQueryAnchor *, NSUInteger, NSError *) = ^ (NSArray *results, HKQueryAnchor *newAnchor, NSUInteger newAnchorValue, NSError *error) { - if (error) { - // An error in the query's not the end of the world: we'll probably get another chance. Just log it. - ORK_Log_Warning(@"Anchored query error: %@", error); - return; - } + if (error) { + // An error in the query's not the end of the world: we'll probably get another chance. Just log it. + ORK_Log_Warning(@"Anchored query error: %@", error); + return; + } - ORKStrongTypeOf(self) strongSelf = weakSelf; + __typeof(self) strongSelf = weakSelf; [strongSelf query_logResults:results withAnchor:newAnchor anchorValue:newAnchorValue]; }; HKAnchoredObjectQuery *anchoredQuery; if ([HKAnchoredObjectQuery instancesRespondToSelector:@selector(initWithType:predicate:anchor:limit:resultsHandler:)]) { - + anchoredQuery = [[HKAnchoredObjectQuery alloc] initWithType:_quantityType predicate:_samplePredicate anchor:_anchor @@ -172,9 +170,9 @@ static const NSInteger _HealthAnchoredQueryLimit = 100; ^(HKAnchoredObjectQuery *query, NSArray *sampleObjects, NSArray *deletedObjects, HKQueryAnchor *newAnchor, NSError *error) { handleResults(sampleObjects, newAnchor, 0, error); }]; - } - else if ([HKAnchoredObjectQuery instancesRespondToSelector:@selector(initWithType:predicate:anchor:limit:completionHandler:)]) { - + } else if ([HKAnchoredObjectQuery instancesRespondToSelector:@selector(initWithType:predicate:anchor:limit:completionHandler:)]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" anchoredQuery = [[HKAnchoredObjectQuery alloc] initWithType:_quantityType predicate:_samplePredicate anchor:_anchorValue @@ -182,7 +180,8 @@ static const NSInteger _HealthAnchoredQueryLimit = 100; completionHandler: ^(HKAnchoredObjectQuery *query, NSArray<__kindof HKSample *> *results, NSUInteger newAnchor, NSError *error) { handleResults(results, nil, newAnchor, error); - }]; + }]; +#pragma clang diagnostic pop } else { NSAssert(NO, @"Could not instantiate an HKAnchoredObjectQuery."); @@ -194,10 +193,10 @@ static const NSInteger _HealthAnchoredQueryLimit = 100; [super start]; if (!_logger) { - NSError *error = nil; - _logger = [self makeJSONDataLoggerWithError:&error]; + NSError *err = nil; + _logger = [self makeJSONDataLoggerWithError:&err]; if (!_logger) { - [self finishRecordingWithError:error]; + [self finishRecordingWithError:err]; return; } } @@ -205,7 +204,7 @@ static const NSInteger _HealthAnchoredQueryLimit = 100; if (![HKHealthStore isHealthDataAvailable]) { [self finishRecordingWithError:[NSError errorWithDomain:NSCocoaErrorDomain code:NSFeatureUnsupportedError - userInfo:@{@"recorder": self}]]; + userInfo:@{@"recorder" : self}]]; return; } @@ -225,12 +224,12 @@ static const NSInteger _HealthAnchoredQueryLimit = 100; NSAssert(!_observerQuery, @"observer query should not exist if not recording"); - ORKWeakTypeOf(self) weakSelf = self; + __weak __typeof(self) weakSelf = self; _observerQuery = [[HKObserverQuery alloc] initWithSampleType:_quantityType predicate:_samplePredicate updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) { - ORKStrongTypeOf(self) strongSelf = weakSelf; + __typeof(self) strongSelf = weakSelf; dispatch_async(dispatch_get_main_queue(), ^{ if (error) { diff --git a/ResearchKit/ActiveTasks/ORKHolePegTestPlaceHoleView.h b/ResearchKit/ActiveTasks/ORKHolePegTestPlaceHoleView.h index bc0889d2..8b26dff7 100644 --- a/ResearchKit/ActiveTasks/ORKHolePegTestPlaceHoleView.h +++ b/ResearchKit/ActiveTasks/ORKHolePegTestPlaceHoleView.h @@ -36,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN ORK_CLASS_AVAILABLE -@interface ORKHolePegTestPlaceHoleView : UIView +@interface ORKHolePegTestPlaceHoleView : UIView @property (nonatomic, assign, getter = isRotated) BOOL rotated; @property (nonatomic, assign, getter = isSuccess) BOOL success; diff --git a/ResearchKit/ActiveTasks/ORKHolePegTestRemovePegView.h b/ResearchKit/ActiveTasks/ORKHolePegTestRemovePegView.h index 4da98d1f..c444c38a 100644 --- a/ResearchKit/ActiveTasks/ORKHolePegTestRemovePegView.h +++ b/ResearchKit/ActiveTasks/ORKHolePegTestRemovePegView.h @@ -36,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN ORK_CLASS_AVAILABLE -@interface ORKHolePegTestRemovePegView : UIView +@interface ORKHolePegTestRemovePegView : UIView @property (nonatomic, assign, getter = isSuccess) BOOL success; diff --git a/ResearchKit/ActiveTasks/ORKTappingContentView.h b/ResearchKit/ActiveTasks/ORKTappingContentView.h index f040ffc8..f22417bb 100644 --- a/ResearchKit/ActiveTasks/ORKTappingContentView.h +++ b/ResearchKit/ActiveTasks/ORKTappingContentView.h @@ -48,6 +48,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong, readonly) ORKRoundTappingButton *tapButton2; +@property (nonatomic, assign) NSInteger lastTappedButton; + @end NS_ASSUME_NONNULL_END diff --git a/ResearchKit/ActiveTasks/ORKTappingContentView.m b/ResearchKit/ActiveTasks/ORKTappingContentView.m index 6a2973aa..01cda702 100644 --- a/ResearchKit/ActiveTasks/ORKTappingContentView.m +++ b/ResearchKit/ActiveTasks/ORKTappingContentView.m @@ -78,6 +78,7 @@ _progressView = [UIProgressView new]; _progressView.translatesAutoresizingMaskIntoConstraints = NO; _progressView.progressTintColor = [self tintColor]; + [_progressView setIsAccessibilityElement:YES]; [_progressView setAlpha:0]; _tapButton1 = [[ORKRoundTappingButton alloc] init]; @@ -88,6 +89,8 @@ _tapButton2.translatesAutoresizingMaskIntoConstraints = NO; [_tapButton2 setTitle:ORKLocalizedString(@"TAP_BUTTON_TITLE", nil) forState:UIControlStateNormal]; + _lastTappedButton = -1; + [self addSubview:_tapCaptionLabel]; [self addSubview:_tapCountLabel]; [self addSubview:_progressView]; @@ -132,9 +135,15 @@ - (void)setProgress:(CGFloat)progress animated:(BOOL)animated { [_progressView setProgress:progress animated:animated]; + + CGFloat previousAlpha = _progressView.alpha; [UIView animateWithDuration:animated ? 0.2 : 0 animations:^{ [_progressView setAlpha:(progress == 0) ? 0 : 1]; }]; + + if (UIAccessibilityIsVoiceOverRunning() && previousAlpha != _progressView.alpha) { + UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil); + } } - (void)resetStep:(ORKActiveStepViewController *)viewController { diff --git a/ResearchKit/ActiveTasks/ORKTappingIntervalStepViewController.m b/ResearchKit/ActiveTasks/ORKTappingIntervalStepViewController.m index 850b2269..9d8586a0 100644 --- a/ResearchKit/ActiveTasks/ORKTappingIntervalStepViewController.m +++ b/ResearchKit/ActiveTasks/ORKTappingIntervalStepViewController.m @@ -249,6 +249,11 @@ NSInteger index = (button == _tappingContentView.tapButton1) ? ORKTappingButtonIdentifierLeft : ORKTappingButtonIdentifierRight; + if ( _tappingContentView.lastTappedButton == index ) { + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, ORKLocalizedString(@"TAP_BUTTON_TITLE", nil)); + } + _tappingContentView.lastTappedButton = index; + [self receiveTouch:[[event touchesForView:button] anyObject] onButton:index]; } diff --git a/ResearchKit/Charts/ORKChartTypes.h b/ResearchKit/Charts/ORKChartTypes.h index c28cfc8f..b890d39a 100644 --- a/ResearchKit/Charts/ORKChartTypes.h +++ b/ResearchKit/Charts/ORKChartTypes.h @@ -37,7 +37,9 @@ NS_ASSUME_NONNULL_BEGIN - +/** + Defines the common attributes of chart values. + */ @protocol ORKValueCollectionType /** diff --git a/ResearchKit/Common/ORKAnswerFormat.h b/ResearchKit/Common/ORKAnswerFormat.h index 8fcc49ae..caeecbaf 100644 --- a/ResearchKit/Common/ORKAnswerFormat.h +++ b/ResearchKit/Common/ORKAnswerFormat.h @@ -1325,7 +1325,7 @@ ORK_CLASS_AVAILABLE @return An initialized height answer format. */ -- (instancetype)initWithMeasurementSystem:(ORKMeasurementSystem)easurementSystem NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithMeasurementSystem:(ORKMeasurementSystem)measurementSystem NS_DESIGNATED_INITIALIZER; /** Indicates the measurement system used by the answer format. diff --git a/ResearchKit/Common/ORKAnswerFormat.m b/ResearchKit/Common/ORKAnswerFormat.m index f236850d..b371109d 100644 --- a/ResearchKit/Common/ORKAnswerFormat.m +++ b/ResearchKit/Common/ORKAnswerFormat.m @@ -1097,7 +1097,7 @@ static NSArray *ork_processTextChoices(NSArray *textChoices) { - (NSUInteger)hash { // Don't bother including everything - style is the main item. - return super.hash ^ self.defaultDate.hash ^ _style; + return ([super hash] & [self.defaultDate hash]) ^ _style; } - (NSCalendar *)currentCalendar { @@ -1263,7 +1263,7 @@ static NSArray *ork_processTextChoices(NSArray *textChoices) { - (NSUInteger)hash { // Don't bother including everything - style is the main item - return super.hash ^ self.unit.hash & _style; + return [super hash] ^ ([self.unit hash] & _style); } - (instancetype)initWithStyle:(ORKNumericAnswerStyle)style unit:(NSString *)unit { diff --git a/ResearchKit/Common/ORKChoiceViewCell.m b/ResearchKit/Common/ORKChoiceViewCell.m index 9a0f5874..08c293ac 100644 --- a/ResearchKit/Common/ORKChoiceViewCell.m +++ b/ResearchKit/Common/ORKChoiceViewCell.m @@ -210,11 +210,11 @@ static const CGFloat LabelRightMargin = 44.0; #pragma mark - Accessibility - (NSString *)accessibilityLabel { - if (self.accessoryType == UITableViewCellAccessoryDisclosureIndicator) { - return ORKAccessibilityStringForVariables(self.shortLabel.accessibilityLabel, self.longLabel.accessibilityLabel); - } - NSString *state = (self.selectedItem ? ORKLocalizedString(@"AX_SELECTED", nil) : ORKLocalizedString(@"AX_UNSELECTED", nil)); - return ORKAccessibilityStringForVariables(state, self.shortLabel.accessibilityLabel, self.longLabel.accessibilityLabel); + return ORKAccessibilityStringForVariables(self.shortLabel.accessibilityLabel, self.longLabel.accessibilityLabel); +} + +- (UIAccessibilityTraits)accessibilityTraits { + return UIAccessibilityTraitButton | (self.selectedItem ? UIAccessibilityTraitSelected : 0); } @end diff --git a/ResearchKit/Common/ORKCollector.h b/ResearchKit/Common/ORKCollector.h new file mode 100644 index 00000000..254b465b --- /dev/null +++ b/ResearchKit/Common/ORKCollector.h @@ -0,0 +1,173 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@class ORKCollector; +@class ORKHealthCollector; +@class ORKMotionActivityCollector; + + +/** + Abstract class of data collector. + */ +ORK_CLASS_AVAILABLE +@interface ORKCollector : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + Identifier of this collector. + */ +@property (copy, readonly) NSString *identifier; + +/** + Serialization helper that produces serialized output. + Subclasses should implement to provide a default serialization for upload. + + @params objects The objects to be serialized. + + @return Serialized data object. + */ +- (NSData *)serializedDataForObjects:(NSArray *)objects; + +/** + Serialization helper that produces objects suitable for serialization to JSON. + + Subclasses should implement to provide a default JSON serialization for upload. + Called by `serializedDataForObjects:`. + + @params objects The objects to be serialized. + + @return Serializable dictionary objects. + */ +- (NSArray *)serializableObjectsForObjects:(NSArray *)objects; + +@end + + +/** + ORKHealthCollector collects HKSample. + + It cannot be initiated directly. + Use `addHealthCollectorWithSampleType:`to add one to a `ORKDataCollectionManager`. + */ +ORK_CLASS_AVAILABLE +@interface ORKHealthCollector : ORKCollector + +/** + HealthKit sample type. + */ +@property (copy, readonly) HKSampleType *sampleType; + +/** + HealthKit unit into which data should be collected. + */ +@property (copy, readonly) HKUnit *unit; + +/** + Samples should be collected starting at this date. + */ +@property (copy, readonly) NSDate *startDate; + +/** + Last anchor already seen. + */ +@property (copy, readonly) HKQueryAnchor *lastAnchor; + +@end + + +/** + ORKHealthCollector collects HKCorrelation. + + It cannot be initiated directly. + Use `addHealthCorrelationCollectorWithCorrelationType:`to add one to a `ORKDataCollectionManager`. + */ +ORK_CLASS_AVAILABLE +@interface ORKHealthCorrelationCollector : ORKCollector + +/** + HealthKit correlation type. + */ +@property (copy, readonly) HKCorrelationType *correlationType; + +/** + Array of HKSampleType expected in the correlation. + */ +@property (copy, readonly) NSArray *sampleTypes; + +/** + Array of HKUnit to use when serializing the samples collected (should be same size as sampleTypes). + */ +@property (copy, readonly) NSArray *units; + +/** + Samples should be collected starting at this date. + */ +@property (copy, readonly) NSDate *startDate; + +/** + Last anchor already seen. + */ +@property (copy, readonly) HKQueryAnchor *lastAnchor; + +@end + + +/** + ORKHealthCollector collects CMMotionActivity. + + It cannot be initiated directly. + Use `addMotionActivityCollectorWithStartDate:`to add one to a `ORKDataCollectionManager`. + */ +ORK_CLASS_AVAILABLE +@interface ORKMotionActivityCollector : ORKCollector + +/** + Samples should be collected starting at this date. + */ +@property (copy, readonly) NSDate *startDate; + +/** + Last anchor already seen. + */ +@property (copy, readonly) NSDate *lastDate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ResearchKit/Common/ORKCollector.m b/ResearchKit/Common/ORKCollector.m new file mode 100644 index 00000000..52545841 --- /dev/null +++ b/ResearchKit/Common/ORKCollector.m @@ -0,0 +1,360 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKCollector.h" +#import "ORKCollector_Internal.h" +#import "ORKHelpers_Internal.h" +#import "HKSample+ORKJSONDictionary.h" +#import "CMMotionActivity+ORKJSONDictionary.h" +#import "ORKHealthSampleQueryOperation.h" +#import "ORKMotionActivityQueryOperation.h" +#import + + +static NSString *const ItemsKey = @"items"; +static NSString *const ItemIdentifierFormat = @"org.researchkit.%@"; +static NSString *const ItemIdentifierFormatWithTwoPlaceholders = @"org.researchkit.%@.%@"; + +@implementation ORKCollector + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super init]; + if (self) { + ORK_DECODE_OBJ_CLASS(aDecoder, identifier, NSString); + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + ORK_ENCODE_OBJ(aCoder, identifier); +} + +- (instancetype)initWithIdentifier:(NSString *)identifier { + self = [super init]; + if (self) { + _identifier = identifier; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + ORKCollector *collector = [[[self class] allocWithZone:zone] initWithIdentifier:_identifier]; + return collector; +} + +- (NSData *)serializedDataForObjects:(NSArray *)objects { + + NSDictionary *output = @{ ItemsKey : [self serializableObjectsForObjects:objects] }; + + NSError *localError; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:output + options:NSJSONWritingPrettyPrinted + error:&localError]; + if (!jsonData) { + [NSException raise:NSInternalInconsistencyException format:@"Error serializing objects to JSON: %@", [localError localizedDescription]]; + return nil; + } + + return jsonData; +} + +- (ORKOperation *)collectionOperationWithManager:(ORKDataCollectionManager *)mananger { + ORKThrowMethodUnavailableException(); + return nil; +} + +- (NSArray *)serializableObjectsForObjects:(NSArray *)objects { + ORKThrowMethodUnavailableException(); + return nil; +} + +- (BOOL)isEqual:(id)object { + BOOL classEqual = [self class] == [object class]; + + __typeof(self) castObject = object; + return (classEqual && + ORKEqualObjects(_identifier, castObject.identifier)); +} + +@end + + +@implementation ORKHealthCollector : ORKCollector + +- (instancetype)initWithSampleType:(HKSampleType*)sampleType unit:(HKUnit*)unit startDate:(NSDate*)startDate { + NSString *itemIdentifier = [NSString stringWithFormat:ItemIdentifierFormatWithTwoPlaceholders, sampleType.identifier, unit.unitString]; + self = [super initWithIdentifier:itemIdentifier]; + if (self) { + _sampleType = sampleType; + _unit = unit; + _startDate = startDate; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + ORK_DECODE_OBJ(aDecoder, sampleType); + ORK_DECODE_OBJ(aDecoder, unit); + ORK_DECODE_OBJ(aDecoder, startDate); + ORK_DECODE_OBJ(aDecoder, lastAnchor); + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + + ORK_ENCODE_OBJ(aCoder, sampleType); + ORK_ENCODE_OBJ(aCoder, unit); + ORK_ENCODE_OBJ(aCoder, startDate); + ORK_ENCODE_OBJ(aCoder, lastAnchor); +} + +- (NSArray *)serializableObjectsForObjects:(NSArray *)objects { + NSMutableArray *elements = [NSMutableArray arrayWithCapacity:[objects count]]; + for (HKSample *sample in objects) { + [elements addObject:[sample ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)(ORKSampleIncludeMetadata|ORKSampleIncludeSource|ORKSampleIncludeUUID) unit:self.unit]]; + } + + return elements; +} + +- (ORKOperation*)collectionOperationWithManager:(ORKDataCollectionManager*)mananger { + if (! [HKHealthStore isHealthDataAvailable]) { + return nil; + } + + return [[ORKHealthSampleQueryOperation alloc] initWithCollector:self mananger:mananger]; +} + +- (NSArray *)collectableSampleTypes { + return @[_sampleType]; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + ORKHealthCollector *collector = [super copyWithZone:zone]; + collector->_startDate = self.startDate; + collector->_sampleType = self.sampleType; + collector->_unit = [self.unit copy]; + collector->_lastAnchor = self.lastAnchor; + + return collector; +} + +- (BOOL)isEqual:(id)object { + BOOL isParentSame = [super isEqual:object]; + + __typeof(self) castObject = object; + return (isParentSame && + ORKEqualObjects(_sampleType, castObject.sampleType) && + ORKEqualObjects(_unit, castObject.unit) && + ORKEqualObjects(_startDate, castObject.startDate) && + ORKEqualObjects(_lastAnchor, castObject.lastAnchor)); +} + +@end + + +@implementation ORKHealthCorrelationCollector : ORKCollector + +- (instancetype)initWithCorrelationType:(HKCorrelationType *)correlationType + sampleTypes:(NSArray *)sampleTypes + units:(NSArray *)units + startDate:(NSDate *)startDate { + NSString *itemIdentifier = [NSString stringWithFormat:ItemIdentifierFormat, correlationType.identifier]; + self = [super initWithIdentifier:itemIdentifier]; + if (self) { + _correlationType = correlationType; + _sampleTypes = sampleTypes; + _units = units; + _startDate = startDate; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + ORK_DECODE_OBJ(aDecoder, correlationType); + ORK_DECODE_OBJ_ARRAY(aDecoder, sampleTypes, HKSampleType); + ORK_DECODE_OBJ_ARRAY(aDecoder, units, HKUnit); + ORK_DECODE_OBJ(aDecoder, startDate); + ORK_DECODE_OBJ(aDecoder, lastAnchor); + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + + ORK_ENCODE_OBJ(aCoder, correlationType); + ORK_ENCODE_OBJ(aCoder, sampleTypes); + ORK_ENCODE_OBJ(aCoder, units); + ORK_ENCODE_OBJ(aCoder, startDate); + ORK_ENCODE_OBJ(aCoder, lastAnchor); +} + +- (HKSampleType *)sampleType { + return _correlationType; +} + + +- (NSArray *)collectableSampleTypes { + return self.sampleTypes; +} + + +- (NSArray *)serializableObjectsForObjects:(NSArray *)objects { + NSMutableArray *elements = [NSMutableArray arrayWithCapacity:[objects count]]; + for (HKCorrelation *correlation in objects) { + [elements addObject:[correlation ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)(ORKSampleIncludeMetadata|ORKSampleIncludeSource|ORKSampleIncludeUUID) sampleTypes:self.sampleTypes units:self.units]]; + } + + return elements; +} + +- (ORKOperation *)collectionOperationWithManager:(ORKDataCollectionManager *)manager { + if (! [HKHealthStore isHealthDataAvailable]) { + return nil; + } + + return [[ORKHealthSampleQueryOperation alloc] initWithCollector:self mananger:manager]; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + ORKHealthCorrelationCollector *collector = [super copyWithZone:zone]; + collector->_startDate = self.startDate; + collector->_correlationType = self.correlationType; + collector->_sampleTypes = [self.sampleTypes copy]; + collector->_units = [self.units copy]; + collector->_lastAnchor = self.lastAnchor; + + return collector; +} + +- (BOOL)isEqual:(id)object { + BOOL isParentSame = [super isEqual:object]; + + __typeof(self) castObject = object; + return (isParentSame && + ORKEqualObjects(_correlationType, castObject.correlationType) && + ORKEqualObjects(_sampleTypes, castObject.sampleTypes) && + ORKEqualObjects(_units, castObject.units) && + ORKEqualObjects(_startDate, castObject.startDate) && + ORKEqualObjects(_lastAnchor, castObject.lastAnchor)); +} + +@end + + +@implementation ORKMotionActivityCollector : ORKCollector + +- (instancetype)initWithStartDate:(NSDate *)startDate { + NSString *itemIdentifier = [NSString stringWithFormat:ItemIdentifierFormat, @"activity"]; + self = [super initWithIdentifier:itemIdentifier]; + if (self) { + _startDate = startDate; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + ORK_DECODE_OBJ_CLASS(aDecoder, startDate, NSDate); + ORK_DECODE_OBJ_CLASS(aDecoder, lastDate, NSDate); + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + ORK_ENCODE_OBJ(aCoder, startDate); + ORK_ENCODE_OBJ(aCoder, lastDate); +} + +- (NSArray *)serializableObjectsForObjects:(NSArray *)objects { + // Expect an array of CMMotionActivity objects + NSMutableArray *elements = [NSMutableArray arrayWithCapacity:[objects count]]; + for (CMMotionActivity *activity in objects) { + [elements addObject:[activity ork_JSONDictionary]]; + } + + return elements; +} + +- (ORKOperation *)collectionOperationWithManager:(ORKDataCollectionManager *)mananger { + if (! [CMMotionActivityManager isActivityAvailable]) { + return nil; + } + + return [[ORKMotionActivityQueryOperation alloc] initWithCollector:self queryQueue:nil manager:mananger]; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + ORKMotionActivityCollector *collector = [super copyWithZone:zone]; + collector->_startDate = self.startDate; + collector->_lastDate = self.lastDate; + + return collector; +} + +- (BOOL)isEqual:(id)object { + BOOL isParentSame = [super isEqual:object]; + + __typeof(self) castObject = object; + return (isParentSame && + ORKEqualObjects(_startDate, castObject.startDate) && + ORKEqualObjects(_lastDate, castObject.lastDate)); +} + +@end + diff --git a/ResearchKit/Common/ORKCollector_Internal.h b/ResearchKit/Common/ORKCollector_Internal.h new file mode 100644 index 00000000..40079369 --- /dev/null +++ b/ResearchKit/Common/ORKCollector_Internal.h @@ -0,0 +1,82 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKCollector.h" +#import "ORKDataCollectionManager_Internal.h" + + +@class ORKOperation; + +@interface ORKCollector () + +- (instancetype)initWithIdentifier:(NSString *)identifier; + +- (ORKOperation *)collectionOperationWithManager:(ORKDataCollectionManager *)mananger; + +@end + + +@protocol ORKHealthCollectable + +- (HKSampleType *)sampleType; +- (NSArray *)collectableSampleTypes; +- (NSDate *)startDate; +- (HKQueryAnchor *)lastAnchor; +- (void)setLastAnchor:(HKQueryAnchor *)lastAnchor; + +@end + + +@interface ORKHealthCollector() + +- (instancetype)initWithSampleType:(HKSampleType *)objectType unit:(HKUnit *)unit startDate:(NSDate *)startDate; + +@property (copy) HKQueryAnchor *lastAnchor; + +@end + + +@interface ORKHealthCorrelationCollector() + +- (instancetype)initWithCorrelationType:(HKCorrelationType *)objectType sampleTypes:(NSArray *)sampleTypes units:(NSArray *)units startDate:(NSDate *)startDate; + +@property (copy) HKQueryAnchor *lastAnchor; + +@end + + +@interface ORKMotionActivityCollector() + +- (instancetype)initWithStartDate:(NSDate *)startDate; + +@property (copy) NSDate *lastDate; + +@end diff --git a/ResearchKit/Common/ORKCountdownLabel.m b/ResearchKit/Common/ORKCountdownLabel.m index 73efd2bc..f4b518a6 100644 --- a/ResearchKit/Common/ORKCountdownLabel.m +++ b/ResearchKit/Common/ORKCountdownLabel.m @@ -34,14 +34,6 @@ #import "ORKHelpers_Internal.h" -@interface ORKCountdownLabel () - -@property (nonatomic, copy) NSString *minutesString; -@property (nonatomic, copy) NSString *secondsString; - -@end - - @implementation ORKCountdownLabel { NSInteger _currentCountDownValue; } @@ -64,18 +56,20 @@ - (void)setCountDownValue:(NSInteger)value { _currentCountDownValue = value; - _minutesString = [NSString stringWithFormat:@"%02ld", (long)(value / 60)]; - _secondsString= [NSString stringWithFormat:@"%02ld", (long)(value % 60)]; - [self renderText]; } - (void)renderText { - if (_minutesString.length == 0 || _secondsString.length == 0) { - return; - } - [self setText:[NSString stringWithFormat:@"%@:%@", _minutesString, _secondsString]]; - + static dispatch_once_t onceToken; + static NSDateComponentsFormatter *durationFormatter = nil; + dispatch_once(&onceToken, ^{ + durationFormatter = [NSDateComponentsFormatter new]; + [durationFormatter setUnitsStyle:NSDateComponentsFormatterUnitsStylePositional]; + durationFormatter.allowedUnits = NSCalendarUnitMinute|NSCalendarUnitSecond; + durationFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; + }); + + [self setText:[durationFormatter stringFromTimeInterval:_currentCountDownValue]]; [self invalidateIntrinsicContentSize]; } diff --git a/ResearchKit/Common/ORKDataCollectionManager.h b/ResearchKit/Common/ORKDataCollectionManager.h new file mode 100644 index 00000000..c00ca3a8 --- /dev/null +++ b/ResearchKit/Common/ORKDataCollectionManager.h @@ -0,0 +1,200 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@class ORKCollector; +@class ORKHealthCollector; +@class ORKHealthCorrelationCollector; +@class ORKMotionActivityCollector; +@class ORKDataCollectionManager; + + +/** + The data collection manager delegate is responsible for delivering collected data objects, + and reporting errors during the operation. + */ +@protocol ORKDataCollectionManagerDelegate + +@optional +/** + Method for delivering the collected health data samples. + + @param collector The data collector. + @param samples Collected health data samples. + + @return Boolean indicating whether the samples has be accepted. + If NO is returned or this method is not implemented, the manager will stop the collection for the collector and repeat this same collection next time, + until the data is accepted. + */ +- (BOOL)healthCollector:(ORKHealthCollector *)collector didCollectSamples:(NSArray *)samples; + +/** + Method for delivering the collected health correlations. + + @param collector The data collector. + @param correlations Collected health correlation samples. + + @return Boolean indicating whether the samples has be accepted. + If NO is returned or this method is not implemented, the manager will stop the collection for the collector and repeat this same collection next time, + until the data is accepted. + */ +- (BOOL)healthCorrelationCollector:(ORKHealthCorrelationCollector *)collector didCollectCorrelations:(NSArray *)correlations; + +/** + Method for delivering the collected motion activities. + + @param collector The data collector. + @param motionActivities Collected motion activities. + + @return Boolean indicating whether the samples has be accepted. + If NO is returned or this method is not implemented, the manager will stop the collection for the collector and repeat this same collection next time, + until the data is accepted. + */ +- (BOOL)motionActivityCollector:(ORKMotionActivityCollector *)collector didCollectMotionActivities:(NSArray *)motionActivities; + +/** + Indicating the collection is completed for all the collectors. + + @param manager The data collection manager. + */ +- (void)dataCollectionManagerDidCompleteCollection:(ORKDataCollectionManager *)manager; + +/** + Method for reporting the deteted error during collection. + + @param collector The data collector. + @param error The error object. + */ +- (void)collector:(ORKCollector *)collector didDetectError:(NSError *)error; + +@end + +/** + The data collection manager is used to collect HealthKit data and CoreMotion data. + + It uses collectors to track data types to be collected. + Anchors are used to track progress of each types of data to avoid duplications. + Collected data samples are returned in the delegation methods, return YES to confirm the samples has been accepted. + */ +ORK_CLASS_AVAILABLE +@interface ORKDataCollectionManager : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + Initiate the manager with a persistence directory. + The directory is used to store the configurations and progress of the collectors. + + @param directoryURL URL path for the directory. + + @return Initiated ORKDataCollectionManager instance. + */ +- (instancetype)initWithPersistenceDirectoryURL:(NSURL *)directoryURL NS_DESIGNATED_INITIALIZER; + +/** + An array of collectors. + */ +@property (copy, readonly) NSArray *collectors; + +/** + Implement the delegate to receive collected data objects. + */ +@property (nonatomic, weak, nullable) id delegate; + +/** + Add a collector for HealthKit quantity and category samples. + + @param sampleType HealthKit sample type. + @param unit HealthKit unit into which data should be collected. + @param startDate Samples should be collected starting at this date. + @param error Any error detected during this operation. + + @return Initiated health collector. + */ +- (ORKHealthCollector *)addHealthCollectorWithSampleType:(HKSampleType *)sampleType + unit:(HKUnit *)unit + startDate:(NSDate *)startDate + error:(NSError * _Nullable *)error; + +/** + Add a collector for HealthKit correlations. + + @param correlationType HealthKit correlation type. + @param sampleTypes Array of HKSampleType expected in the correlation. + @param units Array of HKUnit to use when serializing the samples collected (should be same size as sampleTypes). + @param startDate Samples should be collected starting at this date. + @param error Any error detected during this operation. + + @return Initiated health correlation collector. + */ +- (ORKHealthCorrelationCollector *)addHealthCorrelationCollectorWithCorrelationType:(HKCorrelationType *)correlationType + sampleTypes:(NSArray *)sampleTypes + units:(NSArray *)units + startDate:(NSDate *)startDate + error:(NSError * _Nullable *)error; + +/** + Add a collector for motion activity. + + @param startDate When data collection should start. + @param error Error during this operation. + + @return Initiated motion activity collector. + */ +- (ORKMotionActivityCollector *)addMotionActivityCollectorWithStartDate:(NSDate *)startDate + error:(NSError * _Nullable *)error; + +/** + Remove a collector. + + @param collector The collector to be removed. + @param error Error during this operation. + + @return If this operation is successful. + */ +- (BOOL)removeCollector:(ORKCollector *)collector error:(NSError* _Nullable *)error; + +/** + Start data collection. + This method triggers running all the RKCollector collections associated with the present manager. + When the collection is completed, delegate recieves a method call `dataCollectionManagerDidCompleteCollection:`. + */ +- (void)startCollection; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ResearchKit/Common/ORKDataCollectionManager.m b/ResearchKit/Common/ORKDataCollectionManager.m new file mode 100644 index 00000000..f4650bee --- /dev/null +++ b/ResearchKit/Common/ORKDataCollectionManager.m @@ -0,0 +1,342 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKDataCollectionManager_Internal.h" +#import "ORKCollector_Internal.h" +#import "ORKOperation.h" +#import "ORKHelpers_Internal.h" +#import + + +static NSString *const ORKDataCollectionPersistenceFileName = @".dataCollection.ork.data"; + +@implementation ORKDataCollectionManager { + dispatch_queue_t _queue; + NSOperationQueue *_operationQueue; + NSString * _Nonnull _managedDirectory; + NSArray *_collectors; + HKHealthStore *_healthStore; + CMMotionActivityManager *_activityManager; + NSMutableArray *_completionHandlers; +} + +- (instancetype)initWithPersistenceDirectoryURL:(NSURL *)directoryURL { + + self = [super init]; + if (self) { + if (directoryURL == nil) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"directory cannot be nil" userInfo:nil]; + } + + _managedDirectory = directoryURL.path; + + BOOL isDir; + NSFileManager *defaultManager = [NSFileManager defaultManager]; + BOOL directoryExist = [defaultManager fileExistsAtPath:_managedDirectory isDirectory:&isDir]; + + if ((directoryExist && isDir == NO)) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"URL is not a directory" userInfo:nil]; + } + + // Create directory if needed + if (NO == directoryExist) { + NSError *error; + [defaultManager createDirectoryAtPath:_managedDirectory withIntermediateDirectories:YES attributes:nil error:&error]; + + if (error) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Failed to create directory at URL." userInfo:@{@"error" : error}]; + } + } + + // Create persistance file if needed + if (![defaultManager fileExistsAtPath:self.persistFilePath]) { + _collectors = [NSArray new]; + [self persistCollectors]; + } + + NSString *queueId = [@"ResearchKit.DataCollection." stringByAppendingString:_managedDirectory]; + _queue = dispatch_queue_create([queueId cStringUsingEncoding:NSUTF8StringEncoding], DISPATCH_QUEUE_SERIAL); + _operationQueue = [[NSOperationQueue alloc] init]; + } + return self; +} + +#pragma mark Data collection + +// dispatch_sync, but tries not to deadlock if we're already on the specified queue +static inline void dispatch_sync_if_not_on_queue(dispatch_queue_t queue, dispatch_block_t block) { + dispatch_queue_set_specific(queue, (__bridge const void *)(queue), (void*)1, NULL); + if (dispatch_get_specific((__bridge const void *)queue)) { + block(); + } else { + dispatch_sync(queue, block); + } +} + +- (void)onWorkQueueSync:(BOOL (^)(ORKDataCollectionManager *manager))block { + dispatch_sync_if_not_on_queue(_queue, ^{ + if (block(self)) { + [self persistCollectors]; + } + }); +} + +- (void)onWorkQueueAsync:(BOOL (^)(ORKDataCollectionManager *manager))block { + dispatch_async(_queue, ^{ + if (block(self)) { + [self persistCollectors]; + } + }); +} + +- (HKHealthStore *)healthStore { + if (!_healthStore && [HKHealthStore isHealthDataAvailable]){ + _healthStore = [[HKHealthStore alloc] init]; + } + return _healthStore; +} + +- (CMMotionActivityManager *)activityManager { + if (!_activityManager && [CMMotionActivityManager isActivityAvailable]) { + _activityManager = [[CMMotionActivityManager alloc] init]; + } + return _activityManager; +} + +- (NSArray *)collectors { + if (_collectors == nil) { + _collectors = [NSKeyedUnarchiver unarchiveObjectWithFile:[self persistFilePath]]; + if (_collectors == nil) { + @throw [NSException exceptionWithName:NSGenericException reason: [NSString stringWithFormat:@"Failed to read from path %@", [self persistFilePath]] userInfo:nil]; + } + } + return _collectors; +} + +- (NSString * _Nonnull)persistFilePath { + return [_managedDirectory stringByAppendingPathComponent:ORKDataCollectionPersistenceFileName]; +} + +- (void)persistCollectors { + NSArray *collectors = self.collectors; + + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:collectors]; + NSError *error; + [data writeToFile:[self persistFilePath] options:NSDataWritingAtomic|NSDataWritingFileProtectionComplete error:&error]; + + if (error) { + @throw [NSException exceptionWithName:NSGenericException reason: [NSString stringWithFormat:@"Failed to write to path %@", [self persistFilePath]] userInfo:nil]; + } +} + +- (void)addCollector:(ORKCollector *)collector { + NSMutableArray *collectors = [self.collectors mutableCopy]; + [collectors addObject:collector]; + _collectors = [collectors copy]; +} + +- (ORKHealthCollector *)addHealthCollectorWithSampleType:(HKSampleType*)sampleType unit:(HKUnit *)unit startDate:(NSDate *)startDate error:(NSError**)error { + + if (!sampleType) { + @throw [NSException exceptionWithName:ORKInvalidArgumentException reason:@"sampleType cannot be nil" userInfo:nil]; + } + if (!unit) { + @throw [NSException exceptionWithName:ORKInvalidArgumentException reason:@"unit cannot be nil" userInfo:nil]; + } + + __block ORKHealthCollector *healthCollector = nil; + + [self onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager){ + + ORKHealthCollector *collector = [[ORKHealthCollector alloc] initWithSampleType:sampleType unit:unit startDate:startDate]; + [self addCollector:collector]; + healthCollector = collector; + + return YES; + }]; + + return healthCollector; +} + +- (ORKHealthCorrelationCollector *)addHealthCorrelationCollectorWithCorrelationType:(HKCorrelationType *)correlationType + sampleTypes:(NSArray *)sampleTypes + units:(NSArray *)units + startDate:(NSDate *)startDate + error:(NSError * __autoreleasing *)error { + if (!correlationType) { + @throw [NSException exceptionWithName:ORKInvalidArgumentException reason:@"correlationType cannot be nil" userInfo:nil]; + } + if (![sampleTypes count]) { + @throw [NSException exceptionWithName:ORKInvalidArgumentException reason:@"sampleTypes cannot be empty" userInfo:nil]; + } + if ([units count] != [sampleTypes count]) { + @throw [NSException exceptionWithName:ORKInvalidArgumentException reason:@"units should be same length as sampleTypes" userInfo:nil]; + } + + __block ORKHealthCorrelationCollector *healthCorrelationCollector = nil; + [self onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager) { + + ORKHealthCorrelationCollector *collector = [[ORKHealthCorrelationCollector alloc] initWithCorrelationType:correlationType + sampleTypes:sampleTypes + units:units + startDate:startDate]; + [self addCollector:collector]; + healthCorrelationCollector = collector; + return YES; + }]; + + return healthCorrelationCollector; +} + +- (ORKMotionActivityCollector *)addMotionActivityCollectorWithStartDate:(NSDate *)startDate + error:(NSError* __autoreleasing *)error { + + __block ORKMotionActivityCollector *motionActivityCollector = nil; + + [self onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager) { + + ORKMotionActivityCollector *collector = [[ORKMotionActivityCollector alloc] initWithStartDate:startDate]; + [self addCollector:collector]; + motionActivityCollector = collector; + + return YES; + }]; + + return motionActivityCollector; +} + +- (BOOL)removeCollector:(ORKCollector *)collector error:(NSError* __autoreleasing *)error { + if (!collector) { + @throw [NSException exceptionWithName:ORKInvalidArgumentException reason:@"collector cannot be nil" userInfo:nil]; + } + + __block BOOL success = NO; + __block NSError *errorOut = nil; + [self onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager) { + + if (_operationQueue.operationCount > 0) { + ORK_Log_Debug(@"[startWithObserving] returned due to operation queue is not empty (queue size = %@)", @(_operationQueue.operationCount)); + errorOut = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorException userInfo:@{NSLocalizedFailureReasonErrorKey: @"Cannot remove collector during collection."}]; + return NO; + } + + NSMutableArray *collectors = [self.collectors mutableCopy]; + + if (![collectors containsObject:collector]) { + errorOut = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorObjectNotFound userInfo:@{NSLocalizedFailureReasonErrorKey: @"Cannot find collector."}]; + return NO; + } + + + // Remove the collector from the collectors array + [collectors removeObject:collector]; + _collectors = [collectors copy]; + + success = YES; + return YES; + }]; + + if (error) { + *error = errorOut; + } + return success; +} + +- (void)startCollection { + + __weak typeof(self) weakSelf = self; + NSMutableArray *operations = [NSMutableArray array]; + [self onWorkQueueAsync:^BOOL(ORKDataCollectionManager *manager) { + + if (_operationQueue.operationCount > 0) { + ORK_Log_Debug(@"[startWithObserving] returned due to operation queue is not empty (queue size = %@)", @(_operationQueue.operationCount)); + return NO; + } + + self.lastCollectionDate = [NSDate date]; + + // Create an operation for each collector + for (ORKCollector *collector in self.collectors) { + + __block ORKOperation *operation = [collector collectionOperationWithManager:self]; + + // operation could be nil if this type of data collection is not possible + // on this device. + if (operation) { + __block ORKOperation *blockOp = operation; + + [operation setCompletionBlock:^{ + typeof(self) strongSelf = weakSelf; + if (blockOp.error) { + id delegate = strongSelf.delegate; + if (delegate && [delegate respondsToSelector:@selector(collector:didDetectError:)]) { + [delegate collector:collector didDetectError:blockOp.error]; + } + } + }]; + + [operations addObject:operation]; + } + } + + NSBlockOperation *completionOperation = [NSBlockOperation new]; + [completionOperation addExecutionBlock:^{ + + typeof(self) strongSelf = weakSelf; + [strongSelf onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager) { + if (_delegate && [_delegate respondsToSelector:@selector(dataCollectionManagerDidCompleteCollection:)]) { + [_delegate dataCollectionManagerDidCompleteCollection:self]; + } + + for (HKObserverQueryCompletionHandler handler in _completionHandlers) { + handler(); + } + [_completionHandlers removeAllObjects]; + + return NO; + }]; + }]; + + for (NSOperation *operation in operations) { + [completionOperation addDependency:operation]; + } + + ORK_Log_Debug(@"Data Collection queue - new operations:\n%@", operations); + [_operationQueue addOperations:operations waitUntilFinished:NO]; + [_operationQueue addOperation:completionOperation]; + + // No need to persist collectors + return NO; + }]; + +} + +@end diff --git a/ResearchKit/Common/ORKDataCollectionManager_Internal.h b/ResearchKit/Common/ORKDataCollectionManager_Internal.h new file mode 100644 index 00000000..1465471e --- /dev/null +++ b/ResearchKit/Common/ORKDataCollectionManager_Internal.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKDataCollectionManager.h" +#import + + +@interface ORKDataCollectionManager () + +@property (nonatomic, strong, readonly) HKHealthStore *healthStore; + +@property (nonatomic, strong, readonly) CMMotionActivityManager *activityManager; + +- (void)onWorkQueueSync:(BOOL (^)(ORKDataCollectionManager *manager))block; + +- (void)onWorkQueueAsync:(BOOL (^)(ORKDataCollectionManager *manager))block; + +/** + Last collection date. + */ +@property (nonatomic, strong) NSDate *lastCollectionDate; + +@end diff --git a/ResearchKit/Common/ORKFormStepViewController.m b/ResearchKit/Common/ORKFormStepViewController.m index f7ea62a5..3e8122fc 100644 --- a/ResearchKit/Common/ORKFormStepViewController.m +++ b/ResearchKit/Common/ORKFormStepViewController.m @@ -365,7 +365,7 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.navigationItem.leftBarButtonItem); + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); } - (void)updateDefaults:(NSMutableDictionary *)defaults { diff --git a/ResearchKit/Common/ORKHealthSampleQueryOperation.h b/ResearchKit/Common/ORKHealthSampleQueryOperation.h new file mode 100644 index 00000000..b70c31c4 --- /dev/null +++ b/ResearchKit/Common/ORKHealthSampleQueryOperation.h @@ -0,0 +1,49 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import "ORKOperation.h" + + +@class ORKDataCollectionManager; +@class ORKCollector; +@protocol ORKHealthCollectable; + +/** + Operation for extracting and preparing HK data for upload. This operation + runs on the specified study / data type combo until there is no more HK data available, + or until file protection kicks in, stopping further preparation. + */ +@interface ORKHealthSampleQueryOperation : ORKOperation + +- (instancetype)initWithCollector:(ORKCollector *)collector mananger:(ORKDataCollectionManager *)manager; + +@end diff --git a/ResearchKit/Common/ORKHealthSampleQueryOperation.m b/ResearchKit/Common/ORKHealthSampleQueryOperation.m new file mode 100644 index 00000000..634115d4 --- /dev/null +++ b/ResearchKit/Common/ORKHealthSampleQueryOperation.m @@ -0,0 +1,247 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKHealthSampleQueryOperation.h" +#import "ORKCollector.h" +#import "ORKHelpers_Internal.h" +#import "ORKCollector_Internal.h" +#import "ORKDataCollectionManager_Internal.h" + + +static NSUInteger const QueryLimitSize = 1000; + +@implementation ORKHealthSampleQueryOperation { + // All of these are strong references created at init time + ORKCollector *_collector; + __weak ORKDataCollectionManager *_manager; + HKQueryAnchor *_currentAnchor; + dispatch_semaphore_t _sem; +} + + +// Run this only on the manager work queue +- (BOOL)_shouldContinue { + BOOL shouldContinue = YES; + + if (!_manager || !_collector) { + shouldContinue = NO; + } + if (![_manager.collectors containsObject:_collector]) { + shouldContinue = NO; + } + + return shouldContinue; +} + +- (instancetype)initWithCollector:(ORKCollector *)collector mananger:(ORKDataCollectionManager *)manager { + NSParameterAssert(collector); + NSParameterAssert(manager); + + self = [super init]; + if (self) { + _collector = collector; + _manager = manager; + _currentAnchor = nil; + _sem = dispatch_semaphore_create(0); + + self.startBlock = ^void(ORKOperation* operation) { + [(ORKHealthSampleQueryOperation*)operation doNextQuery]; + }; + + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@(%p):%@>",NSStringFromClass([self class]), self, _collector]; +} + +- (void)finishWithErrorCode:(ORKErrorCode)error { + self.error = [NSError errorWithDomain:ORKErrorDomain code:error userInfo:nil]; + [self safeFinish]; +} + +- (void)doNextQuery { + [self.lock lock]; + + __block HKSampleType *sampleType = nil; + __block NSDate *startDate = nil; + + __block HKQueryAnchor *lastAnchor = nil; + __block NSString *itemIdentifier = nil; + + // Check if everything's valid and we should continue with collection + __block BOOL shouldContinue = YES; + + [_manager onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager) { + + shouldContinue = [self _shouldContinue]; + + BOOL changed = NO; + if (shouldContinue) { + // _currentAnchor will be NSNotFound on the first pass of the operation + if (_currentAnchor != nil) { + changed = YES; + // Update the anchor if we have one + _collector.lastAnchor = [_currentAnchor copy]; + } + + lastAnchor = _collector.lastAnchor; + sampleType = _collector.sampleType; + startDate = _collector.startDate; + itemIdentifier = _collector.identifier; + } + + return changed; + }]; + + if (_currentAnchor == nil) { + _currentAnchor = lastAnchor; + } + + if (!shouldContinue) { + [self finishWithErrorCode:ORKErrorInvalidObject]; + [self.lock unlock]; + return; + } + + __weak ORKHealthSampleQueryOperation * weakSelf = self; + + NSPredicate *predicate = nil; + if (startDate) { + predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:nil options:HKQueryOptionStrictStartDate]; + } + + HKQueryAnchor *anchor = _currentAnchor; + HKAnchoredObjectQuery *syncQuery = [[HKAnchoredObjectQuery alloc] initWithType:sampleType + predicate:predicate + anchor:anchor + limit:QueryLimitSize + resultsHandler:^(HKAnchoredObjectQuery *query, + NSArray<__kindof HKSample *> *sampleObjects, + NSArray *deletedObjects, + HKQueryAnchor *newAnchor, + NSError *error) { + + ORKHealthSampleQueryOperation *op = weakSelf; + ORK_Log_Debug(@"\nHK Query returned: %@\n", @{@"sampleType": sampleType, @"items":@([sampleObjects count]), @"newAnchor":[newAnchor description]?:@"nil"}); + // Signal that query returned + dispatch_semaphore_signal(_sem); + [op handleResults:sampleObjects newAnchor:newAnchor error:error itemIdentifier:itemIdentifier]; + }]; + + + ORK_Log_Debug(@"\nHK Query: %@ \n", @{@"identifier": sampleType.identifier, @"anchor": anchor.description ? :@"", @"startDate": [NSDateFormatter localizedStringFromDate:startDate dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]}); + [_manager.healthStore executeQuery:syncQuery]; + + [self.lock unlock]; + + dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + if (dispatch_semaphore_wait(_sem, timeout)) { + [self timeoutForAnchor:anchor]; + } + }); + +} + +- (void)timeoutForAnchor:(HKQueryAnchor *)anchor { + ORK_Log_Debug(@"Query timeout: cancel operation %@", self); + [self.lock lock]; + + if ([self isExecuting] && ![self isCancelled] && [anchor isEqual:_currentAnchor]) { + self.error = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorException userInfo:@{NSLocalizedDescriptionKey:@"Query timeout"}]; + [self safeFinish]; + } + + [self.lock unlock]; +} + +/* + Handles the result of an HKAnchoredObjectQuery, and starts a new query if needed + */ +- (void)handleResults:(NSArray *)results + newAnchor:(HKQueryAnchor *)newAnchor + error:(NSError *)error + itemIdentifier:(NSString *)itemIdentifier { + [self.lock lock]; + // Check our actual state under the lock + + if (![self isExecuting] || [self isCancelled]) { + // Give up immediately if we've been cancelled or are no longer executing + [self.lock unlock]; + return; + } + if (error) { + // Give up if there was an error performing the query + self.error = error; + [self safeFinish]; + [self.lock unlock]; + return; + } + + [self.lock unlock]; + + BOOL doContinue = (results && [results count] > 0); + if (doContinue) { + id delegate = _manager.delegate; + + BOOL handoutSuccess = NO; + + if (delegate) { + if ([_collector isKindOfClass:[ORKHealthCollector class]] + && [delegate respondsToSelector:@selector(healthCollector:didCollectSamples:)]) { + handoutSuccess = [delegate healthCollector:(ORKHealthCollector *)_collector didCollectSamples:results]; + } else if ([_collector isKindOfClass:[ORKHealthCorrelationCollector class]] + && [delegate respondsToSelector:@selector(healthCorrelationCollector:didCollectCorrelations:)]) { + handoutSuccess = [delegate healthCorrelationCollector:(ORKHealthCorrelationCollector *)_collector didCollectCorrelations:(NSArray *)results]; + } + } + + if (!handoutSuccess) { + doContinue = NO; + self.error = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorException userInfo:@{NSLocalizedFailureReasonErrorKey: @"Results are not devlivered to delegate properly."}]; + } + } + + if (doContinue) { + // Do the next fetch + self->_currentAnchor = newAnchor; + [self doNextQuery]; + + } else { + // Stop for now (even if maybe we haven't fetched all the records) + [self safeFinish]; + } +} + +@end diff --git a/ResearchKit/Common/ORKMotionActivityQueryOperation.h b/ResearchKit/Common/ORKMotionActivityQueryOperation.h new file mode 100644 index 00000000..f254d832 --- /dev/null +++ b/ResearchKit/Common/ORKMotionActivityQueryOperation.h @@ -0,0 +1,48 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKOperation.h" +#import "ORKDataCollectionManager_Internal.h" + + +@class ORKMotionActivityCollector; + +/** + Operation for extracting and preparing CoreMotion data for upload. This operation + runs until there is no more CoreMotion data available, or until otherwise stopped. + */ +@interface ORKMotionActivityQueryOperation : ORKOperation + +- (instancetype)initWithCollector:(ORKMotionActivityCollector*)collector + queryQueue:(NSOperationQueue*)queue + manager:(ORKDataCollectionManager *)manager; + +@end diff --git a/ResearchKit/Common/ORKMotionActivityQueryOperation.m b/ResearchKit/Common/ORKMotionActivityQueryOperation.m new file mode 100644 index 00000000..e36a7ac4 --- /dev/null +++ b/ResearchKit/Common/ORKMotionActivityQueryOperation.m @@ -0,0 +1,206 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKMotionActivityQueryOperation.h" +#import +#import "ORKCollector.h" +#import "ORKHelpers_Internal.h" +#import "ORKCollector_Internal.h" +#import "ORKDataCollectionManager_Internal.h" + + +@implementation ORKMotionActivityQueryOperation { + + // All of these are strong references created at init time + ORKMotionActivityCollector *_collector; + NSOperationQueue *_queue; + NSDate *_currentDate; + __weak ORKDataCollectionManager *_manager; +} + +- (instancetype)initWithCollector:(ORKMotionActivityCollector*)collector + queryQueue:(NSOperationQueue*)queue + manager:(ORKDataCollectionManager *)manager { + self = [super init]; + if (self) { + _collector = collector; + _manager = manager; + _queue = queue ? : [NSOperationQueue mainQueue]; + _currentDate = nil; + + self.startBlock = ^void(ORKOperation* a) { + [(ORKMotionActivityQueryOperation*)a doQuery]; + }; + + } + return self; +} + +- (NSString*)description { + return [NSString stringWithFormat:@"<%@(%p):%@>",NSStringFromClass([self class]), self, _collector]; +} + +- (void)finishWithErrorCode:(ORKErrorCode)error { + self.error = [NSError errorWithDomain:ORKErrorDomain code:error userInfo:nil]; + [self safeFinish]; +} + +- (void)doQuery { + [self.lock lock]; + + __block NSDate *startDate = nil; + + __block NSDate *lastDate = nil; + __block NSString *itemIdentifier = nil; + + [_manager onWorkQueueSync:^BOOL(ORKDataCollectionManager *manager) { + BOOL changed = NO; + + // _currentAnchor will be NSNotFound on the first pass of the operation + if (_currentDate != nil) { + changed = YES; + + // Update the anchor if we have one + _collector.lastDate = _currentDate; + } + + lastDate = _collector.lastDate; + startDate = _collector.startDate; + itemIdentifier = _collector.identifier; + + return changed; + }]; + + if (_currentDate == nil) { + _currentDate = lastDate; + } + + __weak ORKMotionActivityQueryOperation * weakSelf = self; + + NSDate *queryBeginDate = _currentDate?:startDate; + NSDate *queryEndDate = [NSDate date]; + if (!queryBeginDate) { + queryBeginDate = [NSDate distantPast]; + } + + ORK_Log_Debug(@"\nMotion Query: %@\n", @{@"from": queryBeginDate, @"to":queryEndDate}); + + // Run a single query up to current date + [_manager.activityManager queryActivityStartingFromDate:queryBeginDate toDate:queryEndDate toQueue:_queue withHandler:^(NSArray *activities, NSError *error) { + ORKMotionActivityQueryOperation *op = weakSelf; + ORK_Log_Debug(@"\nMotion Query: %@\n", @{@"from": queryBeginDate, @"to":queryEndDate, @"returned count": @(activities.count)}); + [op handleResults:activities queryBegin:queryBeginDate queryEnd:queryEndDate error:error itemIdentifier:itemIdentifier]; + }]; + + [self.lock unlock]; + +} + +/* + Handles the results, and starts a new query if needed + */ +- (void)handleResults:(NSArray *)results + queryBegin:(NSDate *)queryBegin + queryEnd:(NSDate *)queryEnd + error:(NSError *)error + itemIdentifier:(NSString *)itemIdentifier { + [self.lock lock]; + // Check our actual state under the lock + + if ([self isCancelled]) { + // Give up immediately if we've been cancelled + [self.lock unlock]; + return; + } + if (error) { + // Give up if there was an error performing the query + self.error = error; + [self safeFinish]; + [self.lock unlock]; + return; + } + + [self.lock unlock]; + + if (results && [results count] > 0) { + CMMotionActivity *lastObject = (CMMotionActivity *)[results lastObject]; + NSDate *lastObservedDate = lastObject.startDate; + if (![lastObservedDate isEqual:queryBegin] && [lastObservedDate earlierDate:queryBegin] == lastObservedDate && [results count] == 1) { + // Ignore a one-off if it was before the beginning of the query + [self safeFinish]; + return; + } + + __block BOOL handoutSuccess = NO; + + dispatch_semaphore_t sem = dispatch_semaphore_create(0); + + // Dispatch the results back to the data handler, if any + [_manager onWorkQueueAsync:^BOOL(ORKDataCollectionManager *manager) { + id delegate = _manager.delegate; + + if (delegate && [delegate respondsToSelector:@selector(motionActivityCollector:didCollectMotionActivities:)]) { + handoutSuccess = [delegate motionActivityCollector:_collector didCollectMotionActivities:results]; + } + + dispatch_semaphore_signal(sem); + return YES; + }]; + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); + + if (!handoutSuccess) { + self.error = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorException userInfo:@{NSLocalizedFailureReasonErrorKey: @"Results are not devlivered properly."}]; + } + + // If successfully reported to delegate, and we observed at + // least one valid sample, update the "current" date + // (the start date of the next query) + if (lastObservedDate && handoutSuccess) { + + // Write the query end as the finish date. This is ok because in CoreMotion + // entries are local and unlikely to be written for dates prior to "now". + NSDate *nextStartDate = queryEnd ? : lastObservedDate; + self->_currentDate = nextStartDate; + + // Store it on the collector + [_manager onWorkQueueAsync:^BOOL(ORKDataCollectionManager *manager) { + _collector.lastDate = nextStartDate; + return YES; + }]; + + } + + } + + [self safeFinish]; +} + +@end diff --git a/ResearchKit/Common/ORKNavigationContainerView.m b/ResearchKit/Common/ORKNavigationContainerView.m index bf55b660..183911ab 100644 --- a/ResearchKit/Common/ORKNavigationContainerView.m +++ b/ResearchKit/Common/ORKNavigationContainerView.m @@ -85,9 +85,11 @@ // Disable button for 0.5s ((UIView *)sender).userInteractionEnabled = NO; + ((ORKTextButton *)sender).isInTransition = YES; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // Re-enable skip button ((UIView *)sender).userInteractionEnabled = YES; + ((ORKTextButton *)sender).isInTransition = NO; }); } @@ -100,9 +102,11 @@ // Disable button for 0.5s ((UIView *)sender).userInteractionEnabled = NO; + ((ORKTextButton *)sender).isInTransition = YES; _continueButtonJustTapped = YES; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ _continueButtonJustTapped = NO; + ((ORKTextButton *)sender).isInTransition = NO; [self updateContinueAndSkipEnabled]; }); } diff --git a/ResearchKit/Common/ORKOperation.h b/ResearchKit/Common/ORKOperation.h new file mode 100644 index 00000000..10dfb654 --- /dev/null +++ b/ResearchKit/Common/ORKOperation.h @@ -0,0 +1,72 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import + + +typedef NS_ENUM(NSInteger, ORKOperationState) { + ORKOperationReady, + ORKOperationExecuting, + ORKOperationFinished +}; + + +@class ORKOperation; + +typedef void (^ORKOperationBlock)(ORKOperation *operation); + + +/** + A concurrent operation for collecting data for upload. + */ +@interface ORKOperation : NSOperation + +@property (nonatomic, strong) NSRecursiveLock *lock; +@property (readwrite, nonatomic, assign) ORKOperationState state; +@property (nonatomic, strong) NSError *error; + +/** + Block that will be called inside the lock during -start, + just after transitioning to RKOperationExecuting. + */ +@property (nonatomic, strong) ORKOperationBlock startBlock; + +/** + Finishes the operation cleanly. + */ +- (void)safeFinish; + +/** + Sets the error to indicate a timeout, and finishes. + */ +- (void)doTimeout; + +@end diff --git a/ResearchKit/Common/ORKOperation.m b/ResearchKit/Common/ORKOperation.m new file mode 100644 index 00000000..08818a87 --- /dev/null +++ b/ResearchKit/Common/ORKOperation.m @@ -0,0 +1,172 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKOperation.h" +#import "ORKErrors.h" +#import "ORKHelpers_Internal.h" + + +static NSString *keyPathFromOperationState(ORKOperationState state) { + switch (state) { + case ORKOperationReady: + return @"isReady"; + case ORKOperationExecuting: + return @"isExecuting"; + case ORKOperationFinished: + return @"isFinished"; + default: + return @"state"; + } +} + +static BOOL stateTransitionIsValid(ORKOperationState fromState, ORKOperationState toState, BOOL isCancelled) { + switch (fromState) { + case ORKOperationReady: + switch (toState) { + case ORKOperationExecuting: + return YES; + case ORKOperationFinished: + return isCancelled; + default: + return NO; + } + case ORKOperationExecuting: + switch (toState) { + case ORKOperationFinished: + return YES; + default: + return NO; + } + case ORKOperationFinished: + return NO; + default: + return YES; + } +} + + +@implementation ORKOperation + +- (instancetype)init { + self = [super init]; + if (self) { + self.lock = [[NSRecursiveLock alloc] init]; + self.lock.name = @"com.apple.ResearchKit.Operation"; + self.state = ORKOperationReady; + } + return self; +} + +- (void)setState:(ORKOperationState)state { + [self.lock lock]; + if (stateTransitionIsValid(self.state, state, [self isCancelled])) { + NSString *oldStateKey = keyPathFromOperationState(self.state); + NSString *newStateKey = keyPathFromOperationState(state); + + [self willChangeValueForKey:newStateKey]; + [self willChangeValueForKey:oldStateKey]; + _state = state; + [self didChangeValueForKey:oldStateKey]; + [self didChangeValueForKey:newStateKey]; + + } + [self.lock unlock]; +} + + +#pragma mark - NSOperation + +- (BOOL)isReady { + return self.state == ORKOperationReady && [super isReady]; +} + +- (BOOL)isExecuting { + return self.state == ORKOperationExecuting; +} + +- (BOOL)isFinished { + return self.state == ORKOperationFinished; +} + +- (BOOL)isConcurrent { + return YES; +} + +- (void)start { + [self.lock lock]; + + if ([self isCancelled]) { + [self finish]; + } else if ([self isReady]) { + self.state = ORKOperationExecuting; + + ORK_Log_Debug(@"%@ start", self.class); + _startBlock(self); + } + [self.lock unlock]; +} + +- (void)finish { + ORK_Log_Debug(@"%@ finish: %@", self, (self.error ? : @"OK")); + self.state = ORKOperationFinished; +} + +- (void)cancel { + [self.lock lock]; + if (![self isFinished] && ![self isCancelled]) { + if (! self.error) { + self.error = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorException userInfo:nil]; + } + [self willChangeValueForKey:@"isCancelled"]; + [super cancel]; + [self didChangeValueForKey:@"isCancelled"]; + } + [self.lock unlock]; +} + +- (void)safeFinish { + [self.lock lock]; + if ([self isExecuting]) { + [self finish]; + } + [self.lock unlock]; +} + +- (void)doTimeout { + [self.lock lock]; + if (self.state == ORKOperationExecuting) { + self.error = [NSError errorWithDomain:ORKErrorDomain code:ORKErrorException userInfo:nil]; + [self finish]; + } + [self.lock unlock]; +} + +@end diff --git a/ResearchKit/Common/ORKPasscodeStepViewController_Internal.h b/ResearchKit/Common/ORKPasscodeStepViewController_Internal.h index 29f29d2b..ff37aadb 100644 --- a/ResearchKit/Common/ORKPasscodeStepViewController_Internal.h +++ b/ResearchKit/Common/ORKPasscodeStepViewController_Internal.h @@ -56,7 +56,7 @@ typedef NS_ENUM(NSUInteger, ORKPasscodeState) { ORKPasscodeStateConfirmNewEntry }; -@interface ORKPasscodeStepViewController() +@interface ORKPasscodeStepViewController() @property (nonatomic) ORKPasscodeFlow passcodeFlow; @property (nonatomic, weak) id passcodeDelegate; diff --git a/ResearchKit/Common/ORKQuestionStepViewController.m b/ResearchKit/Common/ORKQuestionStepViewController.m index c21d9f67..658ef2f5 100644 --- a/ResearchKit/Common/ORKQuestionStepViewController.m +++ b/ResearchKit/Common/ORKQuestionStepViewController.m @@ -342,7 +342,7 @@ typedef NS_ENUM(NSInteger, ORKQuestionSection) { _visible = YES; - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.navigationItem.leftBarButtonItem); + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); } - (void)viewWillDisappear:(BOOL)animated { diff --git a/ResearchKit/Common/ORKReviewStep.h b/ResearchKit/Common/ORKReviewStep.h index a6ea4967..078a26c5 100644 --- a/ResearchKit/Common/ORKReviewStep.h +++ b/ResearchKit/Common/ORKReviewStep.h @@ -60,7 +60,8 @@ ORK_CLASS_AVAILABLE Returns a new standalone review step that includes the specified identifier, steps, and result source. @param identifier The identifier of the step (a step identifier should be unique within the task). - @param steps The steps that should be reviewed. + @param steps The steps that should be reviewed. Currently, only question, instruction and + form steps can be reviewed. Any other step type will be ignored. @param resultSource The source that should be consulted to obtain the corresponding step results. */ + (instancetype)standaloneReviewStepWithIdentifier:(NSString *)identifier diff --git a/ResearchKit/Common/ORKReviewStepViewController.m b/ResearchKit/Common/ORKReviewStepViewController.m index 4bd4e6cd..9535ed0a 100644 --- a/ResearchKit/Common/ORKReviewStepViewController.m +++ b/ResearchKit/Common/ORKReviewStepViewController.m @@ -92,7 +92,7 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.navigationItem.leftBarButtonItem); + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); } - (void)setContinueButtonItem:(UIBarButtonItem *)continueButtonItem { diff --git a/ResearchKit/Common/ORKStepNavigationRule.swift b/ResearchKit/Common/ORKStepNavigationRule.swift index cb9063e7..1a13a041 100644 --- a/ResearchKit/Common/ORKStepNavigationRule.swift +++ b/ResearchKit/Common/ORKStepNavigationRule.swift @@ -31,21 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import Foundation public extension ORKPredicateStepNavigationRule { - - #if swift(>=3.0) - - convenience init(resultPredicatesAndDestinationStepIdentifiers tuples: [ (resultPredicate: Predicate, destinationStepIdentifier: String) ], defaultStepIdentifierOrNil: String? = nil ) { - var resultPredicates: [Predicate] = [] - var destinationStepIdentifiers: [String] = [] - for tuple in tuples { - resultPredicates.append(tuple.resultPredicate) - destinationStepIdentifiers.append(tuple.destinationStepIdentifier) - } - self.init(resultPredicates: resultPredicates, destinationStepIdentifiers: destinationStepIdentifiers, defaultStepIdentifier: defaultStepIdentifierOrNil, validateArrays: true); - } - - #else - + convenience init(resultPredicatesAndDestinationStepIdentifiers tuples: [ (resultPredicate: NSPredicate, destinationStepIdentifier: String) ], defaultStepIdentifierOrNil: String? = nil ) { var resultPredicates: [NSPredicate] = [] var destinationStepIdentifiers: [String] = [] @@ -55,6 +41,4 @@ public extension ORKPredicateStepNavigationRule { } self.init(resultPredicates: resultPredicates, destinationStepIdentifiers: destinationStepIdentifiers, defaultStepIdentifier: defaultStepIdentifierOrNil, validateArrays: true); } - - #endif } diff --git a/ResearchKit/Common/ORKStepViewController.m b/ResearchKit/Common/ORKStepViewController.m index 066252b2..5ffa31a7 100644 --- a/ResearchKit/Common/ORKStepViewController.m +++ b/ResearchKit/Common/ORKStepViewController.m @@ -443,4 +443,11 @@ static NSString *const _ORKParentReviewStepKey = @"parentReviewStep"; return viewController; } +#pragma mark - Accessibility + +- (BOOL)accessibilityPerformEscape { + [self goBackward]; + return YES; +} + @end diff --git a/ResearchKit/Common/ORKSurveyAnswerCell.h b/ResearchKit/Common/ORKSurveyAnswerCell.h index 7a3bad05..adae97aa 100644 --- a/ResearchKit/Common/ORKSurveyAnswerCell.h +++ b/ResearchKit/Common/ORKSurveyAnswerCell.h @@ -90,6 +90,9 @@ NS_ASSUME_NONNULL_BEGIN - (void)showValidityAlertWithTitle:(NSString *)title message:(NSString *)message; +// Get full width layout for some subclass cells ++ (NSLayoutConstraint *)fullWidthLayoutConstraint:(UIView *)view; + @end NS_ASSUME_NONNULL_END diff --git a/ResearchKit/Common/ORKSurveyAnswerCell.m b/ResearchKit/Common/ORKSurveyAnswerCell.m index f85d1847..791d54d6 100644 --- a/ResearchKit/Common/ORKSurveyAnswerCell.m +++ b/ResearchKit/Common/ORKSurveyAnswerCell.m @@ -74,10 +74,6 @@ } } -- (void)layoutSubviews { - [super layoutSubviews]; -} - - (UITextField *)textField { return nil; } @@ -202,17 +198,32 @@ } - (NSArray *)suggestedCellHeightConstraintsForView:(UIView *)view { - return @[[NSLayoutConstraint constraintWithItem:self - attribute:NSLayoutAttributeHeight - relatedBy:NSLayoutRelationEqual - toItem:nil - attribute:NSLayoutAttributeHeight - multiplier:1.0 - constant:[[self class] suggestedCellHeightForView:view]]]; + NSLayoutConstraint *constaint = [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeHeight + multiplier:1.0 + constant:[[self class] suggestedCellHeightForView:view]]; + constaint.priority = UILayoutPriorityDefaultHigh; + return @[constaint]; } + (CGFloat)suggestedCellHeightForView:(UIView *)view { return ORKGetMetricForWindow(ORKScreenMetricTableCellDefaultHeight, view.window); } ++ (NSLayoutConstraint *)fullWidthLayoutConstraint:(UIView *)view { + NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:view + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1.0 + constant:10000]; + + widthConstraint.priority = UILayoutPriorityDefaultLow + 1; + return widthConstraint; +} + @end diff --git a/ResearchKit/Common/ORKSurveyAnswerCellForNumber.m b/ResearchKit/Common/ORKSurveyAnswerCellForNumber.m index fac1fa83..786fb870 100644 --- a/ResearchKit/Common/ORKSurveyAnswerCellForNumber.m +++ b/ResearchKit/Common/ORKSurveyAnswerCellForNumber.m @@ -104,6 +104,9 @@ NSMutableArray *constraints = [NSMutableArray new]; NSDictionary *views = NSDictionaryOfVariableBindings(_containerView, _textFieldView); + // Get a full width layout + [constraints addObject:[self.class fullWidthLayoutConstraint:_containerView]]; + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_containerView]-|" options:(NSLayoutFormatOptions)0 metrics:nil diff --git a/ResearchKit/Common/ORKSurveyAnswerCellForScale.m b/ResearchKit/Common/ORKSurveyAnswerCellForScale.m index f45110c3..b48ef27c 100644 --- a/ResearchKit/Common/ORKSurveyAnswerCellForScale.m +++ b/ResearchKit/Common/ORKSurveyAnswerCellForScale.m @@ -77,6 +77,10 @@ options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views]]; + + // Get a full width layout + NSLayoutConstraint *widthConstraint = [self.class fullWidthLayoutConstraint:_sliderView]; + [self addConstraints:@[widthConstraint]]; } [self answerDidChange]; diff --git a/ResearchKit/Common/ORKSurveyAnswerCellForText.m b/ResearchKit/Common/ORKSurveyAnswerCellForText.m index 90f1a48a..f50578fe 100644 --- a/ResearchKit/Common/ORKSurveyAnswerCellForText.m +++ b/ResearchKit/Common/ORKSurveyAnswerCellForText.m @@ -124,6 +124,9 @@ options:(NSLayoutFormatOptions)0 metrics:nil views:views]]; + // Get full width layout + [constraints addObject:[self.class fullWidthLayoutConstraint:_textView]]; + [NSLayoutConstraint activateConstraints:constraints]; } @@ -204,7 +207,7 @@ [_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; - [self.contentView addSubview:_textField]; + [self addSubview:_textField]; ORKEnableAutoLayoutForViews(@[_textField]); [self setUpConstraints]; @@ -218,14 +221,16 @@ NSMutableArray *constraints = [NSMutableArray new]; NSDictionary *views = NSDictionaryOfVariableBindings(_textField); [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_textField]-|" - options:(NSLayoutFormatOptions)0 + options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views]]; [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_textField]-|" - options:(NSLayoutFormatOptions)0 + options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views]]; + // Get a full width layout + [constraints addObject:[self.class fullWidthLayoutConstraint:_textField]]; [NSLayoutConstraint activateConstraints:constraints]; } diff --git a/ResearchKit/Common/ORKTableStepViewController.m b/ResearchKit/Common/ORKTableStepViewController.m index fa9a0921..f290fa00 100644 --- a/ResearchKit/Common/ORKTableStepViewController.m +++ b/ResearchKit/Common/ORKTableStepViewController.m @@ -64,7 +64,7 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.navigationItem.leftBarButtonItem); + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); } // Override to monitor button title change diff --git a/ResearchKit/Common/ORKTaskViewController.m b/ResearchKit/Common/ORKTaskViewController.m index 431e95cc..d53d3fd0 100644 --- a/ResearchKit/Common/ORKTaskViewController.m +++ b/ResearchKit/Common/ORKTaskViewController.m @@ -201,13 +201,13 @@ static void *_ORKViewControllerToolbarObserverContext = &_ORKViewControllerToolb + (void)initialize { if (self == [ORKTaskViewController class]) { - [[UINavigationBar appearanceWhenContainedIn:[ORKTaskViewController class], nil] setTranslucent:NO]; - if ([[UINavigationBar appearanceWhenContainedIn:[ORKTaskViewController class], nil] barTintColor] == nil) { - [[UINavigationBar appearanceWhenContainedIn:[ORKTaskViewController class], nil] setBarTintColor:ORKColor(ORKToolBarTintColorKey)]; + [[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[ORKTaskViewController class]]] setTranslucent:NO]; + if ([[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[ORKTaskViewController class]]] barTintColor] == nil) { + [[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[ORKTaskViewController class]]] setBarTintColor:ORKColor(ORKToolBarTintColorKey)]; } - if ([[UIToolbar appearanceWhenContainedIn:[ORKTaskViewController class], nil] barTintColor] == nil) { - [[UIToolbar appearanceWhenContainedIn:[ORKTaskViewController class], nil] setBarTintColor:ORKColor(ORKToolBarTintColorKey)]; + if ([[UIToolbar appearanceWhenContainedInInstancesOfClasses:@[[ORKTaskViewController class]]] barTintColor] == nil) { + [[UIToolbar appearanceWhenContainedInInstancesOfClasses:@[[ORKTaskViewController class]]] setBarTintColor:ORKColor(ORKToolBarTintColorKey)]; } } } diff --git a/ResearchKit/Common/ORKTextButton.h b/ResearchKit/Common/ORKTextButton.h index 15aaf909..4011f2b9 100644 --- a/ResearchKit/Common/ORKTextButton.h +++ b/ResearchKit/Common/ORKTextButton.h @@ -39,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN */ ORK_CLASS_AVAILABLE @interface ORKTextButton : UIButton - +@property (nonatomic) BOOL isInTransition; @end diff --git a/ResearchKit/Common/ORKTextButton.m b/ResearchKit/Common/ORKTextButton.m index b0480212..afab1018 100644 --- a/ResearchKit/Common/ORKTextButton.m +++ b/ResearchKit/Common/ORKTextButton.m @@ -119,4 +119,12 @@ return [super intrinsicContentSize]; } +- (UIAccessibilityTraits)accessibilityTraits { + // prevent VoiceOver from speaking "dimmed" when transitioning between pages + if (self.isInTransition) { + return [super accessibilityTraits] & ~UIAccessibilityTraitNotEnabled; + } + return [super accessibilityTraits]; +} + @end diff --git a/ResearchKit/Common/ORKVideoCaptureCameraPreviewView.h b/ResearchKit/Common/ORKVideoCaptureCameraPreviewView.h new file mode 100644 index 00000000..f5c881fe --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureCameraPreviewView.h @@ -0,0 +1,50 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@interface ORKVideoCaptureCameraPreviewView : UIView + +@property (nonatomic, weak, nullable) AVCaptureSession *session; +@property (nonatomic) AVCaptureVideoOrientation videoOrientation; +@property (nonatomic, weak, nullable) UIImage *templateImage; +@property (nonatomic) UIEdgeInsets templateImageInsets; +@property (nonatomic, getter=isTemplateImageHidden) BOOL templateImageHidden; +@property (nonatomic, weak, nullable) NSURL *videoFileURL; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ResearchKit/Common/ORKVideoCaptureCameraPreviewView.m b/ResearchKit/Common/ORKVideoCaptureCameraPreviewView.m new file mode 100644 index 00000000..379bed36 --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureCameraPreviewView.m @@ -0,0 +1,231 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKVideoCaptureCameraPreviewView.h" +#import "ORKTintedImageView.h" +#import "ORKHelpers_Internal.h" +#import + + +@implementation ORKVideoCaptureCameraPreviewView { + AVCaptureVideoPreviewLayer *_previewLayer; + ORKTintedImageView *_templateImageView; + NSLayoutConstraint *_templateImageViewTopInsetConstraint; + NSLayoutConstraint *_templateImageViewLeftInsetConstraint; + NSLayoutConstraint *_templateImageViewBottomInsetConstraint; + NSLayoutConstraint *_templateImageViewRightInseConstraint; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _previewLayer = [AVCaptureVideoPreviewLayer new]; + _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; + _previewLayer.needsDisplayOnBoundsChange = YES; + [self.layer addSublayer:_previewLayer]; + + _templateImageView = [ORKTintedImageView new]; + _templateImageView.contentMode = UIViewContentModeScaleAspectFit; + _templateImageView.shouldApplyTint = YES; + _templateImageView.hidden = YES; + _templateImageView.alpha = 0; + [self addSubview:_templateImageView]; + + [self setUpConstraints]; + } + return self; +} + +- (void)setUpConstraints { + NSMutableArray *constraints = [NSMutableArray new]; + + self.translatesAutoresizingMaskIntoConstraints = NO; + _templateImageView.translatesAutoresizingMaskIntoConstraints = NO; + + // Make the insets for the template image view changeable later + _templateImageViewTopInsetConstraint = [NSLayoutConstraint constraintWithItem:_templateImageView + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeTop + multiplier:1.0 + constant:0.0]; + [constraints addObject:_templateImageViewTopInsetConstraint]; + + _templateImageViewLeftInsetConstraint = [NSLayoutConstraint constraintWithItem:_templateImageView + attribute:NSLayoutAttributeLeft + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeLeft + multiplier:1.0 + constant:0.0]; + [constraints addObject:_templateImageViewLeftInsetConstraint]; + + _templateImageViewBottomInsetConstraint = [NSLayoutConstraint constraintWithItem:_templateImageView + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeBottom + multiplier:1.0 + constant:0.0]; + [constraints addObject:_templateImageViewBottomInsetConstraint]; + + _templateImageViewRightInseConstraint = [NSLayoutConstraint constraintWithItem:_templateImageView + attribute:NSLayoutAttributeRight + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeRight + multiplier:1.0 + constant:0.0]; + [constraints addObject:_templateImageViewRightInseConstraint]; + + [NSLayoutConstraint activateConstraints:constraints]; +} + +- (AVCaptureSession *)session { + return _previewLayer.session; +} + +- (void)setSession:(AVCaptureSession *)session { + _previewLayer.session = session; +} + +- (UIImage *)templateImage { + return _templateImageView.image; +} + +- (void)setTemplateImage:(UIImage *)templateImage { + _templateImageView.image = templateImage; +} + +- (void)setTemplateImageHidden:(BOOL)templateImageHidden { + if (!templateImageHidden) { + _templateImageView.hidden = NO; + } + + [UIView animateWithDuration:0.15 + animations:^{ + _templateImageView.alpha = templateImageHidden ? 0 : 1; + } completion:^(BOOL finished) { + _templateImageView.hidden = templateImageHidden; + }]; + +} + +- (BOOL)isTemplateImageHidden { + return _templateImageView.hidden; +} + +- (void)setVideoFileURL:(NSURL *)videoFileURL { + _videoFileURL = videoFileURL; + _previewLayer.hidden = videoFileURL!=nil; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + // Ensure that the preview layer takes up all the space + _previewLayer.frame = self.frame; + + // Update the insets for the template image view. + [self updateInsets]; +} + +- (void)updateInsets { + // Update the layoutMargins to match those being used by the preview layer content, if needed + UIEdgeInsets previewLayerContentFrameInsets = [self getPreviewLayerContentFrameInsets]; + if (!UIEdgeInsetsEqualToEdgeInsets(previewLayerContentFrameInsets, self.layoutMargins)) { + self.layoutMargins = previewLayerContentFrameInsets; + } + + // Update the insets on the template image view, if needed + CGRect previewLayerContentFrame = UIEdgeInsetsInsetRect(_previewLayer.frame, previewLayerContentFrameInsets); + UIEdgeInsets insets = UIEdgeInsetsMake(round(self.templateImageInsets.top * previewLayerContentFrame.size.height), + round(self.templateImageInsets.left * previewLayerContentFrame.size.width), + round(self.templateImageInsets.bottom * previewLayerContentFrame.size.height), + round(self.templateImageInsets.right * previewLayerContentFrame.size.width)); + + if (_templateImageViewTopInsetConstraint.constant != insets.top) { + _templateImageViewTopInsetConstraint.constant = insets.top; + } + if (_templateImageViewLeftInsetConstraint.constant != insets.left) { + _templateImageViewLeftInsetConstraint.constant = insets.left; + } + if (_templateImageViewBottomInsetConstraint.constant != -insets.bottom) { + _templateImageViewBottomInsetConstraint.constant = -insets.bottom; + } + if (_templateImageViewRightInseConstraint.constant != -insets.right) { + _templateImageViewRightInseConstraint.constant = -insets.right; + } +} + +- (UIEdgeInsets)getPreviewLayerContentFrameInsets { + // Determine the insets on the preview layer frame that correspond to the actual video content + // when using a videoGravity of AVLayerVideoGravityResizeAspect; + NSArray *inputs = _previewLayer.session.inputs; + if (!inputs || inputs.count == 0) + return UIEdgeInsetsZero; + AVCaptureDeviceInput* input = (AVCaptureDeviceInput*)inputs[0]; + CMVideoDimensions cmd = CMVideoFormatDescriptionGetDimensions(input.device.activeFormat.formatDescription); + AVCaptureVideoOrientation avcvo = _previewLayer.connection.videoOrientation; + BOOL landscape = avcvo == AVCaptureVideoOrientationLandscapeLeft || avcvo == AVCaptureVideoOrientationLandscapeRight; + + CGRect contentFrame = AVMakeRectWithAspectRatioInsideRect(CGSizeMake(landscape ? cmd.width : cmd.height, landscape ? cmd.height : cmd.width), _previewLayer.frame); + CGRect overallFrame = _previewLayer.frame; + return UIEdgeInsetsMake(contentFrame.origin.y - overallFrame.origin.y, + contentFrame.origin.x - overallFrame.origin.x, + (overallFrame.origin.y + overallFrame.size.height) - (contentFrame.origin.y + contentFrame.size.height), + (overallFrame.origin.x + overallFrame.size.width) - (contentFrame.origin.x + contentFrame.size.width)); +} + +- (AVCaptureVideoOrientation)videoOrientation { + return _previewLayer.connection.videoOrientation; +} + +- (void)setVideoOrientation:(AVCaptureVideoOrientation)videoOrientation { + _previewLayer.connection.videoOrientation = videoOrientation; +} + +#pragma mark - Accessibility + +- (BOOL)isAccessibilityElement { + return self.videoFileURL == nil; +} + +- (NSString *)accessibilityLabel { + return ORKLocalizedString(@"AX_VIDEO_CAPTURE_LABEL", nil); +} + +- (UIAccessibilityTraits)accessibilityTraits { + return [super accessibilityTraits] | UIAccessibilityTraitStartsMediaSession; +} + +@end diff --git a/ResearchKit/Common/ORKVideoCaptureStep.h b/ResearchKit/Common/ORKVideoCaptureStep.h new file mode 100644 index 00000000..11fad518 --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureStep.h @@ -0,0 +1,127 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +/** + The `ORKVideoCaptureStep` class represents a step that captures a video through the device + camera. A template image can optionally be laid over the camera preview to assist in properly + capturing the video. + + To use the video capture step, optionally set the `templateImage` and `templateImageInsets` + properties, incorporate the step into a task, and present the task with a task view controller. + + If implementing a video capture task like this one, remember that people will + take your instructions literally. So be cautious. Make sure your template image + is high contrast and very visible against a variety of backgrounds. + + The recording length can be a max of 20 minutes. It defaults to 2 minutes. + */ +ORK_CLASS_AVAILABLE +@interface ORKVideoCaptureStep : ORKStep + +/** + An image to be displayed over the camera preview. + + The image is stretched to fit the available space while retaining its aspect ratio. + When choosing a size for this asset, be sure to take into account the variations in device + form factors. + */ +@property (nonatomic, strong) UIImage *templateImage; + +/** + Insets to be used in positioning and sizing the `templateImage`. + + The insets are interpreted as percentages relative to the preview frame size. The left + and right insets are relative to the width of the preview frame. The top and bottom + insets are relative to the height of the preview frame. + */ +@property (nonatomic) UIEdgeInsets templateImageInsets; + +/** + The duration, in seconds, for the recording. + + The maximum that this can be set to is 20.0 minutes (60*20 seconds). + The minimum that this can be set to is 0.01 minutes (1 second). + + The default value is 2.0 minutes (60*2 seconds). + */ +@property (nonatomic) NSNumber *duration; + +/** + A Boolean indicating whether the audio is recorded or not. + + The default value is NO. + */ +@property (nonatomic, getter=isAudioMute) BOOL audioMute; + +/** + Constants indicating the mode of the flash on the receiver's device, if it has one. + + The default value is `AVCaptureFlashModeOff` (see `AVCaptureFlashMode`). + */ +@property (nonatomic) AVCaptureFlashMode flashMode; + +/** + Constants indicating the physical position of an AVCaptureDevice's hardware on the system. + + The default value is `AVCaptureDevicePositionBack` (see `AVCaptureDevicePosition`). + If `AVCaptureDevicePositionUnspecified` is set, then it defaults to `AVCaptureDevicePositionBack`. + */ +@property (nonatomic) AVCaptureDevicePosition devicePosition; + +/** + An accessibility hint of the capture preview. + + This property can be used to specify accessible instructions for capturing the video. The + use of this property can assist when the `templateImage` may not be visible + to the user. + + For example, if you want to capture a video of the user's right hand, you may use a template + image that displays the outline of the right hand. You may also want to set this property + to a string such as @"Extend your right hand, palm side down, one foot from your device. + Tap the Capture Video button, or two finger tap on the preview, to capture a video of your + extended right hand." + */ +@property (nonatomic, copy) NSString *accessibilityInstructions; + +/** + An accessibility hint of the capture button. + */ +@property (nonatomic, copy) NSString *accessibilityHint; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ResearchKit/Common/ORKVideoCaptureStep.m b/ResearchKit/Common/ORKVideoCaptureStep.m new file mode 100644 index 00000000..6705dc8b --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureStep.m @@ -0,0 +1,119 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKVideoCaptureStep.h" +#import "ORKHelpers_Internal.h" +#import "ORKStep_Private.h" +#import "ORKVideoCaptureStepViewController.h" + + +@implementation ORKVideoCaptureStep + ++ (Class)stepViewControllerClass { + return [ORKVideoCaptureStepViewController class]; +} + +- (instancetype)initWithIdentifier:(NSString *)identifier { + self = [super initWithIdentifier:identifier]; + if (self) { + self.optional = YES; + self.duration = @120; + self.audioMute = NO; + self.flashMode = AVCaptureFlashModeOff; + self.devicePosition = AVCaptureDevicePositionBack; + } + return self; +} + +- (void)setDuration:(NSNumber *)duration { + _duration = MIN(MAX(duration, @1), @120); +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + ORK_DECODE_IMAGE(aDecoder, templateImage); + ORK_DECODE_UIEDGEINSETS(aDecoder, templateImageInsets); + ORK_DECODE_OBJ(aDecoder, duration); + ORK_DECODE_BOOL(aDecoder, audioMute); + ORK_DECODE_ENUM(aDecoder, flashMode); + ORK_DECODE_ENUM(aDecoder, devicePosition); + ORK_DECODE_OBJ(aDecoder, accessibilityHint); + ORK_DECODE_OBJ(aDecoder, accessibilityInstructions); + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + ORK_ENCODE_IMAGE(aCoder, templateImage); + ORK_ENCODE_UIEDGEINSETS(aCoder, templateImageInsets); + ORK_ENCODE_OBJ(aCoder, duration); + ORK_ENCODE_BOOL(aCoder, audioMute); + ORK_ENCODE_ENUM(aCoder, flashMode); + ORK_ENCODE_ENUM(aCoder, devicePosition); + ORK_ENCODE_OBJ(aCoder, accessibilityHint); + ORK_ENCODE_OBJ(aCoder, accessibilityInstructions); +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + ORKVideoCaptureStep *step = [super copyWithZone:zone]; + step.templateImage = self.templateImage; + step.templateImageInsets = self.templateImageInsets; + step.duration = self.duration; + step.audioMute = self.audioMute; + step.flashMode = self.flashMode; + step.devicePosition = self.devicePosition; + step.accessibilityHint = self.accessibilityHint; + step.accessibilityInstructions = self.accessibilityInstructions; + return step; +} + +- (BOOL)isEqual:(id)object { + BOOL isParentSame = [super isEqual:object]; + + __typeof(self) castObject = object; + return isParentSame && + ORKEqualObjects(self.templateImage, castObject.templateImage) && + UIEdgeInsetsEqualToEdgeInsets(self.templateImageInsets, castObject.templateImageInsets) && + ORKEqualObjects(self.duration, castObject.duration) && + (self.audioMute == castObject.audioMute) && + (self.flashMode == castObject.flashMode) && + (self.devicePosition == castObject.devicePosition) && + ORKEqualObjects(self.accessibilityHint, castObject.accessibilityHint) && + ORKEqualObjects(self.accessibilityInstructions, castObject.accessibilityInstructions); +} + +@end diff --git a/ResearchKit/Common/ORKVideoCaptureStepViewController.h b/ResearchKit/Common/ORKVideoCaptureStepViewController.h new file mode 100644 index 00000000..e9afe0e2 --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureStepViewController.h @@ -0,0 +1,46 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import + + +/** + The `ORKVideoCaptureStepViewController` class represents the step view controller that + corresponds to an `ORKVideoCaptureStep` class. + + It is not usually necessary to instantiate this view controller directly. + Instead, add a video capture step to a task, and present the task in a task + view controller. + */ +ORK_CLASS_AVAILABLE +@interface ORKVideoCaptureStepViewController : ORKStepViewController + +@end diff --git a/ResearchKit/Common/ORKVideoCaptureStepViewController.m b/ResearchKit/Common/ORKVideoCaptureStepViewController.m new file mode 100644 index 00000000..1cd1e75f --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureStepViewController.m @@ -0,0 +1,341 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKStepViewController_Internal.h" +#import "ORKVideoCaptureStepViewController.h" +#import "ORKVideoCaptureView.h" +#import "ORKVideoCaptureStep.h" +#import "ORKHelpers_Internal.h" + +#import + + +@interface ORKVideoCaptureStepViewController () + +@end + + +@implementation ORKVideoCaptureStepViewController { + ORKVideoCaptureView *_videoCaptureView; + ORKVideoCaptureStep *_videoCaptureStep; + dispatch_queue_t _sessionQueue; + AVCaptureSession *_captureSession; + AVCaptureMovieFileOutput *_movieFileOutput; + NSURL *_fileURL; + BOOL _recording; +} + +- (instancetype)initWithStep:(ORKStep *)step result:(ORKResult *)result { + self = [self initWithStep:step]; + if (self) { + ORKStepResult *stepResult = (ORKStepResult *)result; + if (stepResult && [stepResult results].count > 0) { + + ORKFileResult *fileResult = ORKDynamicCast([stepResult results].firstObject, ORKFileResult); + + if (fileResult.fileURL) { + self.fileURL = fileResult.fileURL; + } + } + } + return self; +} + +- (instancetype)initWithStep:(ORKStep *)step { + self = [super initWithStep:step]; + if (self) { + _videoCaptureView = [[ORKVideoCaptureView alloc] initWithFrame:CGRectZero]; + _videoCaptureView.videoCaptureStep = (ORKVideoCaptureStep *)step; + _videoCaptureView.delegate = self; + [self.view addSubview:_videoCaptureView]; + + _videoCaptureStep = (ORKVideoCaptureStep *)self.step; + _movieFileOutput = [AVCaptureMovieFileOutput new]; + + self.fileURL = nil; + + [self setUpConstraints]; + } + return self; +} + +- (void)setUpConstraints { + NSMutableArray *constraints = [NSMutableArray new]; + + NSDictionary *views = @{ @"videoCaptureView": _videoCaptureView }; + _videoCaptureView.translatesAutoresizingMaskIntoConstraints = NO; + + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[videoCaptureView]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[videoCaptureView]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + [NSLayoutConstraint activateConstraints:constraints]; +} + +- (void)setContinueButtonItem:(UIBarButtonItem *)continueButtonItem { + [super setContinueButtonItem:continueButtonItem]; + _videoCaptureView.continueButtonItem = continueButtonItem; +} + +- (void)setSkipButtonItem:(UIBarButtonItem *)skipButtonItem { + [super setSkipButtonItem:skipButtonItem]; + _videoCaptureView.skipButtonItem = skipButtonItem; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Capture actions should be performed off the main queue to keep the UI responsive + _sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL); + + // Setup the capture session + dispatch_async(_sessionQueue, ^{ + [self queue_SetupCaptureSession]; + }); +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + + // If we don't already have a captured image, then start running the capture session. + if (!_fileURL) { + dispatch_async(_sessionQueue, ^{ + [_captureSession startRunning]; + }); + } +} + +- (void)viewWillDisappear:(BOOL)animated { + // If the capture session is running, stop it + if (_captureSession.isRunning) { + dispatch_async(_sessionQueue, ^{ + [_captureSession stopRunning]; + }); + } + + [_videoCaptureView.playerViewController.player pause]; + + [super viewWillDisappear:animated]; +} + +- (void)queue_SetupCaptureSession { + // Create the session + _captureSession = [AVCaptureSession new]; + [_captureSession beginConfiguration]; + + // Get the camera + AVCaptureDevice *device; + + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice *d in devices) { + if (d.position == _videoCaptureStep.devicePosition) { + device = d; + break; + } + } + + if (device) { + // Check if the device has flash. + if ([device isFlashModeSupported:_videoCaptureStep.flashMode]) { + [device lockForConfiguration:nil]; + device.flashMode = _videoCaptureStep.flashMode; + [device unlockForConfiguration]; + } + + // Configure the input and output + AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; + + AVCaptureMovieFileOutput *movieFileOutput = [AVCaptureMovieFileOutput new]; + movieFileOutput.maxRecordedDuration = CMTimeMakeWithSeconds(_videoCaptureStep.duration.floatValue, 30.0); + + if ([_captureSession canAddInput:input] && [_captureSession canAddOutput:movieFileOutput]) { + [_captureSession addInput:input]; + [_captureSession addOutput:movieFileOutput]; + + if (!_videoCaptureStep.audioMute) { + AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil]; + if ([_captureSession canAddInput:audioInput]) { + [_captureSession addInput:audioInput]; + } + } + _movieFileOutput = movieFileOutput; + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [self handleError:[NSError errorWithDomain:NSCocoaErrorDomain code:NSFeatureUnsupportedError userInfo:@{NSLocalizedDescriptionKey:ORKLocalizedString(@"CAPTURE_ERROR_NO_PERMISSIONS", nil)}]]; + }); + _captureSession = nil; + } + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [self handleError:[NSError errorWithDomain:NSCocoaErrorDomain code:NSFeatureUnsupportedError userInfo:@{NSLocalizedDescriptionKey:ORKLocalizedString(@"CAPTURE_ERROR_CAMERA_NOT_FOUND", nil)}]]; + }); + _captureSession = nil; + } + + + [_captureSession commitConfiguration]; + + _videoCaptureView.session = _captureSession; +} + +- (void)handleError:(NSError *)error { + // Shut down the session, if running + if (_captureSession.isRunning) { + ORKStrongTypeOf(_captureSession) strongCaptureSession = _captureSession; + dispatch_async(_sessionQueue, ^{ + [strongCaptureSession stopRunning]; + }); + } + + // Reset the state to before the capture session was setup. Order here is important + _captureSession = nil; + _movieFileOutput = nil; + _videoCaptureView.session = nil; + _videoCaptureView.videoFileURL = nil; + _fileURL = nil; + + // Show the error in the image capture view + _videoCaptureView.error = error; +} + +- (void)setFileURL:(NSURL *)fileURL { + _fileURL = fileURL; + _videoCaptureView.videoFileURL = fileURL; + + [self notifyDelegateOnResultChange]; +} + +- (void)setRecording:(BOOL)recording { + _recording = recording; + _videoCaptureView.recording = recording; +} + +- (ORKStepResult *)result { + ORKStepResult *stepResult = [super result]; + NSDate *now = stepResult.endDate; + + NSMutableArray *results = [NSMutableArray arrayWithArray:stepResult.results]; + ORKFileResult *fileResult = [[ORKFileResult alloc] initWithIdentifier:self.step.identifier]; + fileResult.startDate = stepResult.startDate; + fileResult.endDate = now; + fileResult.contentType = @"video/mp4"; + fileResult.fileURL = _fileURL; + [results addObject:fileResult]; + stepResult.results = [results copy]; + return stepResult; +} + + +#pragma mark - ORKVideoCaptureViewDelegate + +- (void)retakePressed:(void (^)())handler { + dispatch_async(_sessionQueue, ^{ + [_captureSession startRunning]; + dispatch_async(dispatch_get_main_queue(), ^{ + self.fileURL = nil; + if (handler) { + handler(); + } + }); + }); +} + +- (void)capturePressed:(void (^)())handler { + // Capture the video via the output + dispatch_async(_sessionQueue, ^{ + _fileURL = [self.outputDirectory URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4",self.step.identifier]]; + + NSFileManager *fileManager = [NSFileManager defaultManager]; + if ([fileManager fileExistsAtPath:_fileURL.path]) { + [fileManager removeItemAtURL:_fileURL error:nil]; + } + + + [_movieFileOutput startRecordingToOutputFileURL:_fileURL + recordingDelegate:self]; + + // Use the main queue, as UI components may need to be updated + dispatch_async(dispatch_get_main_queue(), ^{ + if (handler) { + handler(); + } + }); + }); +} + +- (void)stopCapturePressed:(void (^)())handler { + dispatch_async(_sessionQueue, ^{ + [_movieFileOutput stopRecording]; + + // Use the main queue, as UI components may need to be updated + dispatch_async(dispatch_get_main_queue(), ^{ + if (handler) { + handler(); + } + }); + }); +} + +- (void)videoOrientationDidChange:(AVCaptureVideoOrientation)videoOrientation { + // Keep the output orientation in sync with the input orientation + NSArray *connections = _movieFileOutput.connections; + if (connections.count > 0) { + connections[0].videoOrientation = videoOrientation; + } +} + + +#pragma mark - AVCaptureFileOutputRecordingDelegate + +- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections { + self.recording = YES; +} + +- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { + if (error && !error.userInfo[AVErrorRecordingSuccessfullyFinishedKey]) { + _videoCaptureView.error = error; + return; + } + + self.recording = NO; + self.fileURL = outputFileURL; + + if (UIAccessibilityIsVoiceOverRunning()) { + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, ORKLocalizedString(@"AX_VIDEO_CAPTURE_COMPLETE", nil)); + } +} + +@end diff --git a/ResearchKit/Common/ORKVideoCaptureView.h b/ResearchKit/Common/ORKVideoCaptureView.h new file mode 100644 index 00000000..7bb616cd --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureView.h @@ -0,0 +1,65 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import +#import "ORKVideoCaptureStep.h" +#import "ORKVideoCaptureCameraPreviewView.h" + + +NS_ASSUME_NONNULL_BEGIN + +@protocol ORKVideoCaptureViewDelegate + +- (void)capturePressed:(void (^ _Nullable)())handler; +- (void)stopCapturePressed:(void (^ _Nullable)())handler; +- (void)retakePressed:(void (^ _Nullable)())handler; +- (void)videoOrientationDidChange:(AVCaptureVideoOrientation)videoOrientation; + +@end + + +@interface ORKVideoCaptureView : UIView + +@property (nonatomic, strong, nullable) ORKVideoCaptureStep *videoCaptureStep; +@property (nonatomic, weak, nullable) id delegate; +@property (nonatomic, weak, nullable) AVCaptureSession *session; +@property (nonatomic, strong, nullable) UIBarButtonItem *continueButtonItem; +@property (nonatomic, strong, nullable) UIBarButtonItem *skipButtonItem; +@property (nonatomic, strong, nullable) NSURL *videoFileURL; +@property (nonatomic, strong, nullable) NSError *error; +@property (nonatomic) BOOL recording; +@property (nonatomic, strong, nullable) ORKVideoCaptureCameraPreviewView *previewView; +@property (nonatomic, strong, readonly) AVPlayerViewController *playerViewController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ResearchKit/Common/ORKVideoCaptureView.m b/ResearchKit/Common/ORKVideoCaptureView.m new file mode 100644 index 00000000..018d785c --- /dev/null +++ b/ResearchKit/Common/ORKVideoCaptureView.m @@ -0,0 +1,436 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import "ORKVideoCaptureView.h" +#import "ORKVideoCaptureCameraPreviewView.h" +#import "ORKNavigationContainerView_Internal.h" +#import "ORKHelpers_Private.h" +#import "ORKHelpers_Internal.h" +#import "ORKSkin.h" +#import "ORKStepHeaderView_Internal.h" + + +@implementation ORKVideoCaptureView { + ORKStepHeaderView *_headerView; + ORKNavigationContainerView *_continueSkipContainer; + UIBarButtonItem *_captureButtonItem; + UIBarButtonItem *_stopButtonItem; + UIBarButtonItem *_recordingButtonItem; + UIBarButtonItem *_recaptureButtonItem; + NSMutableArray *_variableConstraints; + NSTimer *_timer; + CGFloat _recordTime; + NSDateComponentsFormatter *_dateComponentsFormatter; + + BOOL _capturePressesIgnored; + BOOL _stopCapturePressesIgnored; + BOOL _retakePressesIgnored; + BOOL _showSkipButtonItem; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + _previewView = [ORKVideoCaptureCameraPreviewView new]; + [self addSubview:_previewView]; + + _playerViewController = [AVPlayerViewController new]; + _playerViewController.videoGravity = AVLayerVideoGravityResizeAspectFill; + _playerViewController.allowsPictureInPicturePlayback = NO; + [self addSubview:_playerViewController.view]; + + _headerView = [ORKStepHeaderView new]; + _headerView.instructionLabel.text = @" "; + [self addSubview:_headerView]; + + _captureButtonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"CAPTURE_BUTTON_CAPTURE_VIDEO", nil) + style:UIBarButtonItemStylePlain + target:self + action:@selector(capturePressed)]; + + _stopButtonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO", nil) + style:UIBarButtonItemStylePlain + target:self + action:@selector(stopCapturePressed)]; + + _recordingButtonItem = [[UIBarButtonItem alloc] initWithTitle:nil + style:UIBarButtonItemStylePlain + target:self + action:nil]; + + _recaptureButtonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"CAPTURE_BUTTON_RECAPTURE_VIDEO", nil) + style:UIBarButtonItemStylePlain + target:self + action:@selector(retakePressed)]; + + _continueSkipContainer = [ORKNavigationContainerView new]; + _continueSkipContainer.continueEnabled = YES; + _continueSkipContainer.topMargin = 5; + _continueSkipContainer.bottomMargin = 15; + _continueSkipContainer.optional = YES; + _continueSkipContainer.backgroundColor = ORKColor(ORKBackgroundColorKey); + [self addSubview:_continueSkipContainer]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queue_sessionRunning) name:AVCaptureSessionDidStartRunningNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionWasInterrupted:) name:AVCaptureSessionWasInterruptedNotification object:self.session]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionInterruptionEnded:) name:AVCaptureSessionInterruptionEndedNotification object:self.session]; + + [self updateAppearance]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)queue_sessionRunning { + dispatch_async(dispatch_get_main_queue(), ^{ + _previewView.templateImageHidden = NO; + }); +} + +- (void)orientationDidChange { + AVCaptureVideoOrientation orientation; + switch ([[UIApplication sharedApplication] statusBarOrientation]) { + case UIInterfaceOrientationLandscapeRight: + orientation = AVCaptureVideoOrientationLandscapeRight; + break; + case UIInterfaceOrientationLandscapeLeft: + orientation = AVCaptureVideoOrientationLandscapeLeft; + break; + case UIInterfaceOrientationPortraitUpsideDown: + orientation = AVCaptureVideoOrientationPortraitUpsideDown; + break; + case UIInterfaceOrientationPortrait: + orientation = AVCaptureVideoOrientationPortrait; + break; + case UIInterfaceOrientationUnknown: + // Do nothing in these cases, since we don't need to change display orientation. + return; + } + + [_previewView setVideoOrientation:orientation]; + [self.delegate videoOrientationDidChange:orientation]; + [self setNeedsUpdateConstraints]; +} + +- (void)setVideoCaptureStep:(ORKVideoCaptureStep *)videoCaptureStep { + _videoCaptureStep = videoCaptureStep; + + _previewView.templateImage = _videoCaptureStep.templateImage; + _previewView.templateImageInsets = _videoCaptureStep.templateImageInsets; + + _captureButtonItem.accessibilityHint = _videoCaptureStep.accessibilityHint; + + _showSkipButtonItem = _videoCaptureStep.optional; + + [self updateAppearance]; +} + +- (void)updateAppearance { + + _headerView.alpha = (self.error) ? 1 : 0; + _previewView.alpha = (self.error) ? 0 : 1; + + if (self.error) { + // Display the error instruction. + _headerView.instructionLabel.text = [self.error.userInfo valueForKey:NSLocalizedDescriptionKey]; + + // Hide the template image if there is an error + _previewView.templateImageHidden = YES; + _previewView.accessibilityHint = nil; + _playerViewController.view.hidden = YES; + + // Show skip, if available, and hide the template and continue/capture button + _continueSkipContainer.continueButtonItem = nil; + _continueSkipContainer.skipButtonItem = _skipButtonItem; + _continueSkipContainer.skipEnabled = YES; + } else if (self.videoFileURL) { + // Hide the template image after capturing + _previewView.templateImageHidden = YES; + _previewView.accessibilityHint = nil; + _playerViewController.view.hidden = NO; + + // Set the continue button to the one we've saved and configure the skip button as a recapture button + _continueSkipContainer.continueButtonItem = _continueButtonItem; + _continueSkipContainer.skipButtonItem = _recaptureButtonItem; + _continueSkipContainer.skipEnabled = YES; + } else if (self.recording) { + // Show the template image during capturing + _previewView.templateImageHidden = NO; + _previewView.accessibilityHint = _videoCaptureStep.accessibilityInstructions; + _playerViewController.view.hidden = YES; + + // Change the continue button back to capture. + _continueSkipContainer.continueButtonItem = _stopButtonItem; + + // Start a timer to show recording progress. + _recordingButtonItem.title = [self formattedTimeFromSeconds:_videoCaptureStep.duration.floatValue]; + _continueSkipContainer.skipButtonItem = _recordingButtonItem; + _continueSkipContainer.skipEnabled = NO; + _recordTime = 0.0; + _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 + target:self + selector:@selector(updateRecordTime:) + userInfo:nil + repeats:YES]; + } else { + // Show the template image during capturing + _previewView.templateImageHidden = NO; + _previewView.accessibilityHint = _videoCaptureStep.accessibilityInstructions; + _playerViewController.view.hidden = YES; + + // Change the continue button back to capture, and change the recapture button back to skip (if available) + _continueSkipContainer.continueButtonItem = _captureButtonItem; + _continueSkipContainer.skipButtonItem = _skipButtonItem; + _continueSkipContainer.skipEnabled = YES; + } +} + +- (void)setVideoFileURL:(NSURL *)videoFileURL { + _videoFileURL = videoFileURL; + _previewView.videoFileURL = videoFileURL; + + if (_videoFileURL != nil) { + AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:_videoFileURL]; + _playerViewController.player = [[AVPlayer alloc] initWithPlayerItem:item]; + } + + [self updateAppearance]; +} + +- (void)setRecording:(BOOL)recording { + _recording = recording; + [self updateAppearance]; +} + +- (void)setError:(NSError *)error { + _error = error; + [self updateAppearance]; +} + +- (void)updateConstraints { + const CGFloat ContinueSkipContainerTranslucentAlpha = 0.5; + const CGFloat ContinueSkipContainerOpaqueAlpha = 0.0; + + if (_variableConstraints) { + [NSLayoutConstraint deactivateConstraints:_variableConstraints]; + [_variableConstraints removeAllObjects]; + } + + if (!_variableConstraints) { + _variableConstraints = [NSMutableArray new]; + } + + UIView *playerView = _playerViewController.view; + + NSDictionary *views = NSDictionaryOfVariableBindings(self, _previewView, _continueSkipContainer, _headerView, playerView); + ORKEnableAutoLayoutForViews(views.allValues); + + [_variableConstraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_headerView]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + + [_variableConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_previewView]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + + [_variableConstraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_headerView]-[_continueSkipContainer]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + [_variableConstraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_continueSkipContainer]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + [_variableConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[playerView]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + + [_variableConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[playerView]-[_continueSkipContainer]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + + + // Float the continue view over the previewView if in landscape to give more room for the preview + if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { + [_variableConstraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_previewView]|" + options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil + views:views]]; + [_variableConstraints addObject:[NSLayoutConstraint constraintWithItem:_continueSkipContainer + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeBottom + multiplier:1.0 + constant:0.0]]; + _continueSkipContainer.backgroundColor = [_continueSkipContainer.backgroundColor colorWithAlphaComponent:ContinueSkipContainerTranslucentAlpha]; + } else { + [_variableConstraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_previewView]-[_continueSkipContainer]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + _continueSkipContainer.backgroundColor = [_continueSkipContainer.backgroundColor colorWithAlphaComponent:ContinueSkipContainerOpaqueAlpha]; + } + + [NSLayoutConstraint activateConstraints:_variableConstraints]; + [super updateConstraints]; +} + +- (AVCaptureSession *)session { + return _previewView.session; +} + +- (void)setSession:(AVCaptureSession *)session { + _previewView.session = session; + // Set up the proper videoOrientation from the start + [self orientationDidChange]; +} + +- (void)setSkipButtonItem:(UIBarButtonItem *)skipButtonItem { + if (_showSkipButtonItem) { + _skipButtonItem = skipButtonItem; + [self updateAppearance]; + } +} + +- (void)setContinueButtonItem:(UIBarButtonItem *)continueButtonItem { + _continueButtonItem = continueButtonItem; + [self updateAppearance]; +} + +- (void)capturePressed { + // If we are still waiting for the delegate to complete, ignore futher presses + if (_capturePressesIgnored) + return; + + // Ignore futher presses until the delegate completes + _capturePressesIgnored = YES; + + // Capture the video via the delegate + [self.delegate capturePressed:^ { + // Stop ignoring presses + _capturePressesIgnored = NO; + }]; +} + +- (void)stopCapturePressed { + // If we are still waiting for the delegate to complete, ignore futher presses + if (_stopCapturePressesIgnored) + return; + + // Ignore futher presses until the delegate completes + _stopCapturePressesIgnored = YES; + + // Invalidate timer. + [_timer invalidate]; + + // Stop the video capture via the delegate + [self.delegate stopCapturePressed:^ { + // Stop ignoring presses + _stopCapturePressesIgnored = NO; + }]; + +} + +- (void)retakePressed { + // If we are still waiting for the delegate to complete, ignore futher presses + if (_retakePressesIgnored) + return; + + // Ignore futher presses until the delegate completes + _retakePressesIgnored = YES; + + // Tell the delegate to start capturing again + [self.delegate retakePressed:^{ + // Stop ignoring presses + _retakePressesIgnored = NO; + }]; +} + +- (void)updateRecordTime:(NSTimer *)timer { + _recordTime += timer.timeInterval; + + if (_recordTime >= _videoCaptureStep.duration.floatValue || !self.recording) { + [_timer invalidate]; + [self updateAppearance]; + } else { + CGFloat remainingTime = _videoCaptureStep.duration.floatValue - _recordTime; + _recordingButtonItem.title = [self formattedTimeFromSeconds:remainingTime]; + _continueSkipContainer.skipButtonItem = _recordingButtonItem; + } +} + +-(NSString *)formattedTimeFromSeconds:(CGFloat)seconds { + if (!_dateComponentsFormatter) { + _dateComponentsFormatter = [NSDateComponentsFormatter new]; + _dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; + _dateComponentsFormatter.allowedUnits = NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitNanosecond; + } + return [_dateComponentsFormatter stringFromTimeInterval:seconds]; +} + +- (void)sessionWasInterrupted:(NSNotification *)notification { + AVCaptureSessionInterruptionReason reason = [notification.userInfo[AVCaptureSessionInterruptionReasonKey] integerValue]; + if (reason == AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps) { + [self setError:[[NSError alloc] initWithDomain:@"" code:0 userInfo:@{NSLocalizedDescriptionKey : ORKLocalizedString(@"CAMERA_UNAVAILABLE_MESSAGE", nil)}]]; + } + [_previewView.session stopRunning]; +} + +- (void)sessionInterruptionEnded:(NSNotification *)notification { + [self setError:nil]; +} + +- (BOOL)accessibilityPerformMagicTap { + if (self.error) { + return NO; + } + if (self.videoFileURL) { + [self retakePressed]; + } else { + [self capturePressed]; + } + return YES; +} + +@end diff --git a/ResearchKit/Consent/ORKConsentReviewStepViewController.m b/ResearchKit/Consent/ORKConsentReviewStepViewController.m index 1eb01032..1424541f 100644 --- a/ResearchKit/Consent/ORKConsentReviewStepViewController.m +++ b/ResearchKit/Consent/ORKConsentReviewStepViewController.m @@ -382,7 +382,7 @@ static NSString *const _SignatureStepIdentifier = @"signatureStep"; [strongSelf.taskViewController setRegisteredScrollView:reviewViewController.webView.scrollView]; } - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, strongSelf.navigationItem.leftBarButtonItem); + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); } }]; } diff --git a/ResearchKit/Localized/ar.lproj/ResearchKit.strings b/ResearchKit/Localized/ar.lproj/ResearchKit.strings index be8f1fde..76d93d76 100644 --- a/ResearchKit/Localized/ar.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ar.lproj/ResearchKit.strings @@ -119,7 +119,7 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "التحقق"; "VERIFICATION_STEP_TITLE" = "التحقق من البريد الإلكتروني"; -"RESEND_EMAIL_LABEL_MESSAGE" = "اضغط على الرابط أدناه إذا كنت لم تتلق بريد التحقق، وترغب بإرساله لك مرة أخرى."; +"RESEND_EMAIL_LABEL_MESSAGE" = "اضغط على الرابط أدناه إذا كنت لم تستلم بريد التحقق، وترغب بإرساله لك مرة أخرى."; "RESEND_EMAIL_BUTTON_TITLE" = "إعادة إرسال بريد التحقق"; /* Login step */ @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "فقط الأرقام مسموح بها."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "مؤشر تقدم إدخال رمز الدخول"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "تم إدخال %1$@ من %2$@ من الأرقام"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "هل نسيت رمز الدخول؟"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "تعذر إضافة عنصر سلسلة المفاتيح."; @@ -167,6 +168,11 @@ "BOOL_NO" = "لا"; "BOOL_YES" = "نعم"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "سم"; +"MEASURING_UNIT_FT" = "قدم"; +"MEASURING_UNIT_IN" = "بوصة"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "اضغط للإجابة"; "NULL_ANSWER" = "قم بتحديد إجابة"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "حفظ لما بعد"; "BUTTON_OPTION_DISCARD" = "تجاهل النتائج"; "BUTTON_OPTION_STOP_TASK" = "إنهاء المهمة"; +"BUTTON_SAVE" = "حفظ"; +"BUTTON_CLEAR_ANSWER" = "مسح الإجابة"; +"BUTTON_READ_ONLY_MODE" = "لا يمكن تعديل هذه الإجابة."; /* General active tasks. */ "COUNTDOWN_LABEL" = "بدء النشاط خلال"; "TASK_COMPLETE_TITLE" = "اكتمل النشاط"; "TASK_COMPLETE_TEXT" = "سيتم تحليل بياناتك وسيتم إعلامك عندما تصبح النتائج جاهزة."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "متبقٍ %@ من الثواني."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "التقاط صورة"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "لم يتم تحديد دليل إخراج للصور الملتقطة."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "لا يمكن حفظ الصورة الملتقطة."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "بدء التسجيل"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "إيقاف التسجيل"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "إعادة التقاط الفيديو"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "اللياقة"; "FITNESS_DISTANCE_TITLE_FORMAT" = "المسافة ‏(%@)"; @@ -213,7 +228,7 @@ "FITNESS_INTRO_2_TEXT_FORMAT" = "قم بالمشي في الخارج بأقصى سرعة ممكنة لديك لمدة %1$@. عندما تنتهي، اجلس وخذ استراحة لمدة %2$@. للبدء، اضغط على البدء."; /* Short walk active task. */ -"WALK_TASK_TITLE" = "سرعة المشية والتوازن"; +"WALK_TASK_TITLE" = "سرعة المشي والتوازن"; "WALK_INTRO_TEXT" = "يقيس هذا النشاط سرعة مشيتك وتوازنك أثناء المشي والوقوف ثابتًا. لا تقم بالمتابعة إذا لم تكن قادرًا على المشي دون مساعدة."; "WALK_INTRO_2_TEXT_%ld" = "اعثر على مكان يمكنك المشي فيه بصورة آمنة دون مساعدة لمسافة %ld من الخطوات تقريبًا في خط مستقيم."; "WALK_INTRO_2_DETAIL" = "ضع هاتفك في جيبك أو في حقيبة واتبع التعليمات الصوتية."; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "قم بالدوران والمشي رجوعًا إلى نقطة بدايتك."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "قم بمشي حوالي %ld خطوة في خط مستقيم."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "ابحث عن مكان يمكنك المشي فيه ذهابًا وإيابًا في خط مستقيم بشكل آمن. حاول أن تسير بشكل مستمر عن طريق الدوران في نهايات مسارك، كما لو كنت تسير حول مخروط.\n\nبعد ذلك، سيتم إرشادك لتقوم بالدوران في دائرة كاملة، ثم الوقوف ثابتًا مع وضع ذراعيك إلى جانبيك وقدميك متباعدتين بمقدار عرض الكتف تقريبًا."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "اضغط على البدء عندما تكون مستعدًا للبدء.\nثم ضع هاتفك في جيبك أو في حقيبة واتبع التعليمات الصوتية."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "قم بالمشي ذهابًا وإيابًا في خط مستقيم %@. قم بالمشي كما تفعل عادة."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "استدر بمقدار دائرة كاملة ثم قف ثابتًا لمدة %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "لقد أكملت النشاط."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "سرعة الضغط"; +"TAPPING_TASK_TITLE_RIGHT" = "اليد اليمنى"; +"TAPPING_TASK_TITLE_LEFT" = "اليد اليسرى"; "TAPPING_INTRO_TEXT" = "يقيس هذا النشاط سرعتك في الضغط."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "ضع هاتفك على سطح مستوٍ. سيظهر زران على الشاشة لمدة %@. باستخدام إصبعين من نفس اليد، اضغط على الزرين بالتناوب بأقصى سرعة ممكنة لديك."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "ضع هاتفك على سطح مستوٍ."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "استخدم إصبعين من نفس اليد للضغط بالتبادل على الزرين على الشاشة."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "استخدم إصبعين من يدك اليمنى للضغط بالتبادل على الزرين على الشاشة."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "استخدم إصبعين من يدك اليسرى للضغط بالتبادل على الزرين على الشاشة."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "الآن، كرر نفس الاختبار باستخدام يدك اليمنى."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "الآن، كرر نفس الاختبار باستخدام يدك اليسرى."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "اضغط بإصبع، ثم بالإصبع الآخر. حاول ضبط وقت ضغطاتك ليكون متساويًا قدر الإمكان. واستمر في الضغط لمدة %@."; "TAPPING_CALL_TO_ACTION" = "اضغط على البدء لكي تبدأ."; +"TAPPING_CALL_TO_ACTION_NEXT" = "اضغط على التالي للبدء."; "TAP_BUTTON_TITLE" = "الضغط"; "TOTAL_TAPS_LABEL" = "إجمالي الضغطات"; -"TAPPING_INSTRUCTION" = "اضغط على الزرين بأقصى سرعة ممكنة لديك باستخدام إصبعين."; - +"TAPPING_INSTRUCTION" = "اضغط على الزرين بتوافق قدر الإمكان باستخدام إصبعين."; +"TAPPING_INSTRUCTION_RIGHT" = "اضغط على الزرين باستخدام يدك اليمنى."; +"TAPPING_INSTRUCTION_LEFT" = "اضغط على الزرين باستخدام يدك اليسرى."; +"TAPPING_SKIP_TITLE" = "تخطي هذه اليد"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "الصوت"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "يعمل هذا النشاط على تقييم صوتك من خلال تسجيله بالميكروفون الموجود في أسفل هاتفك."; "AUDIO_TOO_LOUD_LABEL" = "عالٍ جدًا"; "AUDIO_GENERIC_ERROR_LABEL" = "غير قادر على تسجيل الصوت"; +"AUDIO_LEVEL_CHECK_LABEL" = "الرجاء الانتظار حتى يتم التحقق من مستوى الضوضاء في الخلفية."; +"AUDIO_TOO_LOUD_MESSAGE" = "مستوى الضوضاء المحيطة عالٍ جدًا بحيث لا يمكن تسجيل صوتك. الرجاء الانتقال إلى مكان أكثر هدوءًا والمحاولة مرة أخرى."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "اضغط على التالي عندما تكون مستعدًا."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "قياس سمع النغمة"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "رفع العقدة باستخدام اصبعين."; "HOLE_PEG_TEST_TEXT_2" = "ارفع الأصابع لإسقاط العقدة."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "نشاط الرُعاش"; +"TREMOR_TEST_INTRO_1_DETAIL" = "يقيس هذا النشاط مقدار رُعاش يديك بمختلف الأوضاع. ابحث عن مكان يمكنك الجلوس فيه بشكل مريح أثناء مدة هذا النشاط."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "أمسك الهاتف في يدك الأكثر تأثرًا كما يظهر في الصورة أدناه."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "أمسك الهاتف في يدك اليمنى كما يظهر في الصورة أدناه."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "أمسك الهاتف في يدك اليسرى كما يظهر في الصورة أدناه."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "سيُطلب منك تنفيذ %@ أثناء الجلوس مع الإمساك بالهاتف في يديك."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "مهمة واحدة"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "مهمتان"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "ثلاث مهام"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "أربع مهام"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "خمس مهام"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "اضغط على التالي للمتابعة."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "استعد لإمساك هاتفك في حِجرك."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "استعد لإمساك هاتفك في حِجرك بيدك اليسرى."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "استعد لإمساك هاتفك في حِجرك بيدك اليمنى."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "استمر في إمساك هاتفك في حِجرك لمدة %ld من الثواني."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "الآن، أمسك هاتفك ويدك ممدودة في مستوى الكتف."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "الآن، أمسك هاتفك ويدك اليسرى ممدودة في مستوى الكتف."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "الآن، أمسك هاتفك ويدك اليمنى ممدودة في مستوى الكتف."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "استمر في إمساك هاتفك ويدك ممدودة لمدة %ld من الثواني."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "الآن، أمسك هاتفك في مستوى الكتف مع ثني مرفقك."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "الآن، أمسك هاتفك ويدك اليسرى في مستوى الكتف مع ثني مرفقك."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "الآن، أمسك هاتفك ويدك اليمنى في مستوى الكتف مع ثني مرفقك."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "استمر في إمساك هاتفك مع ثني مرفقك لمدة %ld من الثواني"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "الآن، مع الاستمرار في ثني مرفقك، المس الهاتف بأنفك بشكل متكرر."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "الآن، مع الاستمرار في ثني مرفقك والإمساك بالهاتف في يدك اليسرى، المس الهاتف بأنفك بشكل متكرر."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "الآن، مع الاستمرار في ثني مرفقك والإمساك بالهاتف في يدك اليمنى، المس الهاتف بأنفك بشكل متكرر."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "استمر في لمس الهاتف بأنفك لمدة %ld من الثواني"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "استعد للتلويح كالملوك (التلويح عن طريق تدوير معصمك)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "استعد للتلويح كالملوك مع إمساك هاتفك في يدك اليسرى (التلويح عن طريق تدوير معصمك)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "استعد للتلويح كالملوك مع إمساك هاتفك في يدك اليمنى (التلويح عن طريق تدوير معصمك)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "استمر في التلويح كالملوك لمدة %ld من الثواني."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "الآن، انقل الهاتف إلى يدك اليسرى وتابع إلى المهمة التالية."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "الآن، انقل الهاتف إلى يدك اليمنى وتابع إلى المهمة التالية."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "تابع إلى المهمة التالية."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "اكتمل النشاط."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "سيُطلب منك تنفيذ %@ أثناء الجلوس مع الإمساك بالهاتف في إحدى يديك، ثم تكرار ذلك باليد الأخرى."; +"TREMOR_SKIP_LEFT_HAND" = "لا يمكنني القيام بهذا النشاط بيدي اليسرى."; +"TREMOR_SKIP_RIGHT_HAND" = "لا يمكنني القيام بهذا النشاط بيدي اليمنى."; +"TREMOR_SKIP_NEITHER" = "يمكنني القيام بهذا النشاط بكلتا يدي."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "تعذر إنشاء الملف"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "تعذر إزالة ملفات السجل الكافية للوصول إلى الحد"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "معاينة الالتقاط"; "AX_IMAGE_CAPTURED_LABEL" = "تم التقاط الصورة"; +"AX_VIDEO_CAPTURE_LABEL" = "معاينة التقاط الفيديو"; +"AX_VIDEO_CAPTURED_LABEL" = "الفيديو الملتقط"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "غير قادر على وضع القرص بحجم %@ على القرص بحجم %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "الهدف"; "AX_TOWER_OF_HANOI_TOWER" = "برج"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "يحتوي على أقراص بأحجام %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "فارغ"; -"AX_GRAPH_RANGE_FORMAT" = "يتراوح من %@ إلى %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "يتراوح من %@ إلى %@"; +"AX_GRAPH_STACK_PREFIX" = "مجموعة تتكون من"; "AX_GRAPH_AND_SEPARATOR" = " و "; "AX_GRAPH_POINT_%@" = "النقطة: %@"; diff --git a/ResearchKit/Localized/ar.lproj/locversion.plist b/ResearchKit/Localized/ar.lproj/locversion.plist index 436a5184..944bc08a 100644 --- a/ResearchKit/Localized/ar.lproj/locversion.plist +++ b/ResearchKit/Localized/ar.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ar LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/ca.lproj/ResearchKit.strings b/ResearchKit/Localized/ca.lproj/ResearchKit.strings index 2e80da1a..4ef69b52 100644 --- a/ResearchKit/Localized/ca.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ca.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Només es permeten caràcters numèrics."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicador de progrés d’ingrés del codi"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ de %@ dígits introduïts"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Has oblidat el codi?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "No s’ha pogut afegir l’ítem del clauer."; @@ -167,6 +168,11 @@ "BOOL_NO" = "No"; "BOOL_YES" = "Sí"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Prémer per contestar"; "NULL_ANSWER" = "Seleccionar una resposta"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Desar per després"; "BUTTON_OPTION_DISCARD" = "Descartar resultats"; "BUTTON_OPTION_STOP_TASK" = "Finalitzar tasca"; +"BUTTON_SAVE" = "Desar"; +"BUTTON_CLEAR_ANSWER" = "Esborrar la resposta"; +"BUTTON_READ_ONLY_MODE" = "Aquesta resposta no es pot modificar."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Iniciant l’activitat en"; -"TASK_COMPLETE_TITLE" = "Activitat completa"; +"TASK_COMPLETE_TITLE" = "Activitat completada"; "TASK_COMPLETE_TEXT" = "S’analitzaran les dades i rebràs una notificació quan tinguis els resultats a punt."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Queden %@ segons."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturar la imatge"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "No s’ha especificat cap directori de sortida per a les imatges capturades."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "No s’ha pogut desar la imatge capturada."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Iniciar la gravació"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Aturar la gravació"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Tornar a capturar el vídeo"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Activitat física"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distància (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Fes mitja volta i torna allà on has començat."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Camina fins a %ld passos en línia recta."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Busca un lloc on puguis anar i tornar caminant en línia recta de forma segura. Camina sense parar i gira al final del camí com si estiguessis vorejant un con.\n\nA continuació, se’t demanarà que giris fent un cercle complet i que et quedis quiet amb els braços als costats i els peus separats més o menys per la mateixa distància que hi ha entre espatlla i espatlla."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Quan estiguis a punt per començar, prem Començar.\nLlavors, posa’t el mòbil a la butxaca o a la bossa i segueix les instruccions d’àudio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Vés i torna caminant en línia recta durant %@. Camina naturalment."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Gira fent un cercle complet i llavors queda’t quiet durant %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Has completat l’activitat."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Velocitat de premuda"; +"TAPPING_TASK_TITLE_RIGHT" = "Mà dreta"; +"TAPPING_TASK_TITLE_LEFT" = "Mà esquerra"; "TAPPING_INTRO_TEXT" = "Aquesta activitat mesura la velocitat de premuda."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Deixa el telèfon sobre una superfície plana. Apareixeran dos botons a la pantalla durant %@. Amb dos dits de la mateixa mà, prem els botons alternadament tan ràpid com puguis."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Deixa el mòbil sobre una superfície plana."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Prem els botons de la pantalla alternant dos dits de la mateixa mà."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Prem els botons de la pantalla alternant dos dits de la mà dreta."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Prem els botons de la pantalla alternant dos dits de la mà esquerra."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Ara repeteix la mateixa operació amb la mà dreta."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Ara repeteix la mateixa operació amb la mà esquerra."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Prem amb un dit, i després amb l’altre. Intenta que el ritme de premuda sigui constant. Prem durant %@."; "TAPPING_CALL_TO_ACTION" = "Per iniciar, prem Començar."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Prem Següent per continuar."; "TAP_BUTTON_TITLE" = "Prem"; "TOTAL_TAPS_LABEL" = "Tocs totals"; -"TAPPING_INSTRUCTION" = "Prem els botons tan ràpid com puguis amb dos dits."; - +"TAPPING_INSTRUCTION" = "Prem els botons amb dos dits al ritme més constant que puguis."; +"TAPPING_INSTRUCTION_RIGHT" = "Prem els botons amb la mà DRETA."; +"TAPPING_INSTRUCTION_LEFT" = "Prem els botons amb la mà ESQUERRA."; +"TAPPING_SKIP_TITLE" = "Ometre aquesta mà"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Veu"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Aquesta activitat avalua la teva veu tot gravant-la amb el micròfon de la part inferior del telèfon."; "AUDIO_TOO_LOUD_LABEL" = "Massa alt"; "AUDIO_GENERIC_ERROR_LABEL" = "No s’ha pogut gravar l’àudio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Espera mentre es calcula el nivell de soroll de fons."; +"AUDIO_TOO_LOUD_MESSAGE" = "El soroll ambiental és massa fort per gravar la teva veu. Vés a un lloc més silenciós i torna‑ho a provar."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Prem Següent quan estiguis a punt."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometria tonal"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Agafa la clavilla fent servir dos dits."; "HOLE_PEG_TEST_TEXT_2" = "Aixeca els dits per deixar caure la clavilla."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Activitat de tremolor"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Aquesta activitat mesura la tremolor de les mans en diferents posicions. Busca un lloc on puguis seure còmodament per fer aquesta activitat."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Agafa el mòbil amb la mà més afectada, tal com es mostra a la imatge de sota."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Agafa el mòbil amb la mà DRETA, tal com es mostra a la imatge de sota."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Agafa el mòbil amb la mà ESQUERRA, tal com es mostra a la imatge de sota."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Quan estiguis assegut i amb el mòbil a la mà, se’t demanarà que completis %@."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "una tasca"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dues tasques"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tres tasques"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "quatre tasques"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinc tasques"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Prem Següent per començar."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepara’t per agafar el mòbil i recolzar la mà sobre la falda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepara’t per agafar el mòbil amb la mà ESQUERRA i recolzar aquesta mà sobre la falda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepara’t per agafar el mòbil amb la mà DRETA i recolzar aquesta mà sobre la falda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Agafa el mòbil i recolza la mà sobre la falda durant %ld segons."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Ara agafa el mòbil i mantén el braç estirat cap enfora a l’altura de l’espatlla."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Ara agafa el mòbil amb la mà ESQUERRA i mantén el braç esquerre estirat cap enfora a l’altura de l’espatlla."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Ara agafa el mòbil amb la mà DRETA i mantén el braç dret estirat cap enfora a l’altura de l’espatlla."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Agafa el mòbil i mantén el braç estirat cap enfora durant %ld segons."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Ara agafa el mòbil i mantén la mà a l’altura de l’espatlla amb el colze doblegat."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Ara agafa el mòbil i mantén la mà ESQUERRA a l’altura de l’espatlla amb el colze doblegat."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Ara agafa el mòbil i mantén la mà DRETA a l’altura de l’espatlla amb el colze doblegat."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Agafa el mòbil i mantén el colze doblegat durant %ld segons."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Ara, amb el colze doblegat, toca el mòbil amb el nas repetidament."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Ara, amb el colze doblegat i el mòbil a la mà ESQUERRA, toca el mòbil amb el nas repetidament."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Ara, amb el colze doblegat i el mòbil a la mà DRETA, toca el mòbil amb el nas repetidament."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Toca el mòbil amb el nas durant %ld segons."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepara’t per fer una salutació reial fent girar el canell amb el mòbil a la mà."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepara’t per fer una salutació reial fent girar el canell amb el mòbil a la mà ESQUERRA."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepara’t per fer una salutació reial fent girar el canell amb el mòbil a la mà DRETA."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Fes una salutació reial durant %ld segons."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Ara agafa el mòbil amb la mà ESQUERRA i avança a la tasca següent."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Ara agafa el mòbil amb la mà DRETA i avança a la tasca següent."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Avança a la tasca següent."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activitat completada."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Quan estiguis assegut i amb el mòbil a la mà, se’t demanarà que completis %@, primer amb una mà i després amb l’altra."; +"TREMOR_SKIP_LEFT_HAND" = "No puc completar l’activitat amb la mà ESQUERRA."; +"TREMOR_SKIP_RIGHT_HAND" = "No puc completar l’activitat amb la mà DRETA."; +"TREMOR_SKIP_NEITHER" = "Puc completar l’activitat amb les dues mans."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "No s’ha pogut crear l’arxiu"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "No s’han pogut eliminar prou arxius de registre per assolir el llindar"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Previsualització de la captura"; "AX_IMAGE_CAPTURED_LABEL" = "Imatge capturada"; +"AX_VIDEO_CAPTURE_LABEL" = "Previsualització de la captura de vídeo"; +"AX_VIDEO_CAPTURED_LABEL" = "Vídeo capturat"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "No s’ha pogut situar el disc de mida %@ sobre el disc de mida %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Objectiu"; "AX_TOWER_OF_HANOI_TOWER" = "Torre"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Té disc amb mides %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Buidar"; -"AX_GRAPH_RANGE_FORMAT" = "Interval de %@ a %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Interval de %@ a %@"; +"AX_GRAPH_STACK_PREFIX" = "Pila composta per"; "AX_GRAPH_AND_SEPARATOR" = " i "; "AX_GRAPH_POINT_%@" = "Punt: %@"; diff --git a/ResearchKit/Localized/ca.lproj/locversion.plist b/ResearchKit/Localized/ca.lproj/locversion.plist index 7e155287..77a9c29d 100644 --- a/ResearchKit/Localized/ca.lproj/locversion.plist +++ b/ResearchKit/Localized/ca.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ca LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/cs.lproj/ResearchKit.strings b/ResearchKit/Localized/cs.lproj/ResearchKit.strings index 6da779e5..b371cb5b 100644 --- a/ResearchKit/Localized/cs.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/cs.lproj/ResearchKit.strings @@ -119,7 +119,7 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "Ověření"; "VERIFICATION_STEP_TITLE" = "Ověřte svůj e-mail"; -"RESEND_EMAIL_LABEL_MESSAGE" = "Pokud jste neobdrželi ověřovací e-mail a chcete, abychom vám ho zaslali znovu, klepněte na odkaz níže."; +"RESEND_EMAIL_LABEL_MESSAGE" = "Pokud jste neobdrželi ověřovací e‑mail a chcete, abychom vám ho zaslali znovu, klepněte na odkaz níže."; "RESEND_EMAIL_BUTTON_TITLE" = "Znovu odeslat ověřovací e‑mail"; /* Login step */ @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Jsou povoleny jen číselné znaky."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indikátor průběhu zadávání kódu"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Zadané číslice: %@ z %@"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Zapomněli jste kód?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Nepodařilo se přidat položku do svazku klíčů."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Ne"; "BOOL_YES" = "Ano"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Odpověď"; "NULL_ANSWER" = "Vyberte odpověď"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Nechat na později"; "BUTTON_OPTION_DISCARD" = "Zahodit výsledky"; "BUTTON_OPTION_STOP_TASK" = "Konec úlohy"; +"BUTTON_SAVE" = "Uložit"; +"BUTTON_CLEAR_ANSWER" = "Smazat odpověď"; +"BUTTON_READ_ONLY_MODE" = "Tuto odpověď nelze změnit."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Aktivita se spustí za"; "TASK_COMPLETE_TITLE" = "Aktivita byla dokončena"; "TASK_COMPLETE_TEXT" = "Data budou analyzována a jakmile budou k dispozici výsledky, obdržíte oznámení."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Zbývá %@ s."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Pořídit obrázek"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Nebyl určen žádný výstupní adresář pro pořízené obrázky."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Pořízený obrázek se nepodařilo uložit."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Začít nahrávat"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Zastavit nahrávání"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Znovu nahrát video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kondice"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Vzdálenost (%@)"; @@ -222,25 +237,45 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Obraťte se a jděte zpátky na začátek."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Ujděte až %ld kroků v přímém směru."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Najděte si místo, na kterém můžete bezpečně přecházet sem a tam po přímé linii. Zkuste chodit bez přestávek a na konci se vždy otočte, jako byste obcházeli kužel.\n\nNásledně dostanete pokyn abyste se otočili kolem své osy a zůstali stát s rukama podél těla a nohama rozkročenýma na šířku ramen."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Až budete připraveni, klepněte na Začít.\nPak uložte telefon do kapsy nebo tašky a postupujte podle zvukových pokynů."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Po %@ se procházejte sem a tam po přímé linii. Jděte normálním krokem."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Otočte se kolem své osy a pak po %@ klidně stůjte."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Dokončili jste aktivitu."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Rychlost klepání"; +"TAPPING_TASK_TITLE_RIGHT" = "Pravá ruka"; +"TAPPING_TASK_TITLE_LEFT" = "Levá ruka"; "TAPPING_INTRO_TEXT" = "Tato aktivita změří vaši rychlost klepání."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Položte telefon na rovný povrch. Na %@ se na obrazovce objeví dvě tlačítka. Dvěma prsty jedné ruky střídavě co nejrychleji na tlačítka klepejte."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Položte telefon na rovný povrch."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Dvěma prsty jedné ruky střídavě klepejte na tlačítka na obrazovce."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Dvěma prsty pravé ruky střídavě klepejte na tlačítka na obrazovce."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Dvěma prsty levé ruky střídavě klepejte na tlačítka na obrazovce."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Nyní test zopakujte pravou rukou."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Nyní test zopakujte levou rukou."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Klepněte jedním prstem a potom druhým. Zkuste klepat co nejvíc rovnoměrně. Pokračujte v klepání po %@."; "TAPPING_CALL_TO_ACTION" = "Začněte klepnutím na Začít."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Začněte klepnutím na Další."; "TAP_BUTTON_TITLE" = "Klepněte"; "TOTAL_TAPS_LABEL" = "Počet klepnutí"; -"TAPPING_INSTRUCTION" = "Dvěma prsty co nejrychleji klepejte na tlačítka."; - +"TAPPING_INSTRUCTION" = "Dvěma prsty co nejrovnoměrněji klepejte na tlačítka."; +"TAPPING_INSTRUCTION_RIGHT" = "Klepejte na tlačítka PRAVOU rukou."; +"TAPPING_INSTRUCTION_LEFT" = "Klepejte na tlačítka LEVOU rukou."; +"TAPPING_SKIP_TITLE" = "Tuto ruku vynechat"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Hlas"; "AUDIO_CALL_TO_ACTION" = "Začněte klepnutím na Začít."; -"AUDIO_INSTRUCTION" = "Řekněte \"Ááááá\" do mikrofonu a vydržte při tom co nejdéle."; +"AUDIO_INSTRUCTION" = "Řekněte \"Ááááá\" do mikrofonu a vydržte co nejdéle."; "AUDIO_INTRO_TEXT" = "Hluboce se nadechněte a při výdechu hlasitě a co nejdéle do mikrofonu vyslovujte \"Ááááá\". Udržujte konstantní úroveň hlasitosti, při které budou proužky zbarvené modře."; "AUDIO_INTENDED_USE" = "Tato aktivita vyhodnotí váš hlas, který bude zaznamenán pomocí mikrofonu u dolního okraje telefonu."; "AUDIO_TOO_LOUD_LABEL" = "Příliš nahlas"; "AUDIO_GENERIC_ERROR_LABEL" = "Nelze zaznamenávat zvuk"; +"AUDIO_LEVEL_CHECK_LABEL" = "Počkejte, než otestujeme úroveň okolního hluku."; +"AUDIO_TOO_LOUD_MESSAGE" = "Úroveň okolního hluku je pro nahrání vašeho hlasu příliš vysoká. Přesuňte se na klidnější místo a zkuste to znovu."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Až budete připraveni, klepněte na Další."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tónová audiometrie"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Uchopte kolík dvěma prsty."; "HOLE_PEG_TEST_TEXT_2" = "Zvednutím prstů kolík pusťte."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Třes rukou"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Tato aktivita měří třas rukou v různých polohách. Najděte si místo, na kterém budete moct po celou dobu aktivity pohodlně sedět."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Podržte telefon ve více postižené ruce tak, jak vidíte na obrázku."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Podržte telefon v PRAVÉ ruce tak, jak vidíte na obrázku."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Podržte telefon v LEVÉ ruce tak, jak vidíte na obrázku."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Budete požádáni o %@ při sezení s telefonem v ruce."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "úkol"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dva úkoly"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tři úkoly"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "čtyři úkoly"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "pět úkolů"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Pokračujte klepnutím na Další."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Připravte se držet telefon na klíně."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Připravte se držet telefon LEVOU rukou na klíně."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Připravte se držet telefon PRAVOU rukou na klíně."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Držte telefon na klíně po %ld s."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Nyní držte telefon rukou nataženou ve výši ramen."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Nyní držte telefon LEVOU rukou nataženou ve výši ramen."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Nyní držte telefon PRAVOU rukou nataženou ve výši ramen."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "S nataženou rukou držte telefon po %ld s."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Nyní ohněte ruku v lokti a držte telefon ve výši ramen."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Nyní držte telefon ve výši ramen LEVOU rukou ohnutou v lokti."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Nyní držte telefon ve výši ramen PRAVOU rukou ohnutou v lokti."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "S rukou ohnutou v lokti držte telefon po %ld s."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Nyní se s rukou ohnutou v lokti opakovaně dotýkejte telefonem nosu."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Nyní držte telefon ve výši ramen LEVOU rukou ohnutou v lokti a dotýkejte se jím opakovaně nosu."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Nyní držte telefon ve výši ramen PRAVOU rukou ohnutou v lokti a dotýkejte se jím opakovaně nosu."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Dotýkejte se telefonem nosu po %ld s."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Připravte se zamávat otáčením zápěstí."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Připravte se zamávat otáčením zápěstí s telefonem v LEVÉ ruce."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Připravte se zamávat otáčením zápěstí s telefonem v PRAVÉ ruce."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Mávejte otáčením zápěstí po %ld s."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Nyní vezměte telefon do LEVÉ ruky a pokračujte dalším úkolem."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Nyní vezměte telefon do PRAVÉ ruky a pokračujte dalším úkolem."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Pokračujte další úlohou."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivita byla dokončena."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Budete požádáni o %@ při sezení s telefonem nejprve v jedné a pak v druhé ruce."; +"TREMOR_SKIP_LEFT_HAND" = "Tuto aktivitu nemůžu provádět LEVOU rukou."; +"TREMOR_SKIP_RIGHT_HAND" = "Tuto aktivitu nemůžu provádět PRAVOU rukou."; +"TREMOR_SKIP_NEITHER" = "Tuto aktivitu můžu provádět oběma rukama."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Soubor nelze vytvořit"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Nepodařilo se odstranit dostatečné množství protokolů pro dosažení prahové hodnoty"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Náhled"; "AX_IMAGE_CAPTURED_LABEL" = "Pořízený obrázek"; +"AX_VIDEO_CAPTURE_LABEL" = "Náhled nahraného videa"; +"AX_VIDEO_CAPTURED_LABEL" = "Nahrané video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Disk o velikosti %@ nelze umístit na disk o velikosti %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Cíl"; "AX_TOWER_OF_HANOI_TOWER" = "Věž"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Obsahuje disky o velikosti %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Prázdné"; -"AX_GRAPH_RANGE_FORMAT" = "Rozmezí od %@ do %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Rozmezí od %@ do %@"; +"AX_GRAPH_STACK_PREFIX" = "Sada se skládá z"; "AX_GRAPH_AND_SEPARATOR" = " a "; "AX_GRAPH_POINT_%@" = "Bod: %@"; diff --git a/ResearchKit/Localized/cs.lproj/locversion.plist b/ResearchKit/Localized/cs.lproj/locversion.plist index 12c7ee67..f945aa1a 100644 --- a/ResearchKit/Localized/cs.lproj/locversion.plist +++ b/ResearchKit/Localized/cs.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale cs LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/da.lproj/ResearchKit.strings b/ResearchKit/Localized/da.lproj/ResearchKit.strings index 17684b0e..47bf307e 100644 --- a/ResearchKit/Localized/da.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/da.lproj/ResearchKit.strings @@ -56,7 +56,7 @@ "LEARN_MORE_DATA_GATHERING" = "Læs mere om, hvordan data indsamles"; "LEARN_MORE_DATA_USE" = "Læs mere om, hvordan data bruges"; "LEARN_MORE_PRIVACY" = "Læs mere om, hvordan din anonymitet og identitet er beskyttet"; -"LEARN_MORE_WELCOME" = "Læs mere om opgaverne først"; +"LEARN_MORE_WELCOME" = "Læs mere om undersøgelsen først"; "LEARN_MORE_STUDY_SURVEY" = "Læs mere om undersøgelsen"; "LEARN_MORE_TIME_COMMITMENT" = "Læs mere om undersøgelsens indflydelse på din tid"; "LEARN_MORE_TASKS" = "Læs mere om de involverede opgaver"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Kun numeriske tegn er tilladt."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Statusindikator for indtastning af adgangskode"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ af %@ cifre indtastet"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Glemt adgangskoden?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Nøgleringsemne kunne ikke tilføjes."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Ingen"; "BOOL_YES" = "Ja"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "fod"; +"MEASURING_UNIT_IN" = "\""; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Tryk for at svare"; "NULL_ANSWER" = "Vælg et svar"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Arkiver til senere"; "BUTTON_OPTION_DISCARD" = "Slet resultater"; "BUTTON_OPTION_STOP_TASK" = "Slut opgave"; +"BUTTON_SAVE" = "Arkiver"; +"BUTTON_CLEAR_ANSWER" = "Ryd svar"; +"BUTTON_READ_ONLY_MODE" = "Dette svar kan ikke ændres."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Starter aktivitet om"; "TASK_COMPLETE_TITLE" = "Aktivitet færdig"; "TASK_COMPLETE_TEXT" = "Dine data vil blive analyseret, og du får besked, når resultaterne er klar."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ sekunder tilbage."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Tag billede"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Der blev ikke anført noget resultatbibliotek til billederne."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Billedet kunne ikke arkiveres."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Start optagelse"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stop optagelse"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Optag video igen"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distance (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Vend om, og gå tilbage til det sted, hvor du startede."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Gå op til %ld trin i en lige linje."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Find et sted, hvor du kan gå sikkert frem og tilbage i en lige linje. Forsøg at gå uden stop ved at vende i slutningen af din rute, som om du går omkring en kegle.\n\nDu vil derefter blive bedt om at dreje 360 grader omkring og derefter stå stille med dine arme ned langs siderne og med en skulderbreddes afstand mellem fødderne."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tryk på Gå i gang, når du er klar til at begynde.\nAnbring derefter telefonen i en lomme eller taske, og følg lydinstruktionerne."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Gå frem og tilbage i en lige linje i %@. Gå, som du plejer."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Drej 360 grader rundt, og stå derefter stille i %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Du har færdiggjort aktiviteten."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Hastighed på tryk"; +"TAPPING_TASK_TITLE_RIGHT" = "Højre hånd"; +"TAPPING_TASK_TITLE_LEFT" = "Venstre hånd"; "TAPPING_INTRO_TEXT" = "Denne aktivitet måler din trykhastighed."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Anbring telefonen på en plan overflade. Der vil vises to knapper på skærmen i %@. Brug derefter to fingre på samme hånd til skiftevis at trykke på knapperne så hurtigt, du kan."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Anbring din telefon på en plan overflade."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Tryk skiftevis på knapperne på skærmen med to fingre på den samme hånd."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Tryk skiftevis på knapperne på skærmen med to fingre på den højre hånd."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Tryk skiftevis på knapperne på skærmen med to fingre på den venstre hånd."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Gentag nu den samme test med din højre hånd."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Gentag nu den samme test med din venstre hånd."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tryk med en finger og derefter med den anden. Forsøg at holde tiden mellem tryk så ensartet som muligt. Fortsæt med at trykke i %@."; "TAPPING_CALL_TO_ACTION" = "Tryk på Gå i gang for at starte."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tryk på Næste for at starte."; "TAP_BUTTON_TITLE" = "Tryk"; "TOTAL_TAPS_LABEL" = "Tryk i alt"; -"TAPPING_INSTRUCTION" = "Tryk på knapperne så hurtigt, som du kan med to fingre."; - +"TAPPING_INSTRUCTION" = "Tryk på knapperne så ensartet, som du kan vha. to fingre."; +"TAPPING_INSTRUCTION_RIGHT" = "Tryk på knapperne med din HØJRE hånd."; +"TAPPING_INSTRUCTION_LEFT" = "Tryk på knapperne med din VENSTRE hånd."; +"TAPPING_SKIP_TITLE" = "Spring denne hånd over"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Stemme"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Denne aktivitet vurderer din stemme ved at optage den med mikrofonen nederst i telefonen."; "AUDIO_TOO_LOUD_LABEL" = "For højt"; "AUDIO_GENERIC_ERROR_LABEL" = "Kan ikke optage lyd"; +"AUDIO_LEVEL_CHECK_LABEL" = "Vent, mens støjniveauet i baggrunden kontrolles."; +"AUDIO_TOO_LOUD_MESSAGE" = "Det omgivende støjniveau er for højt til at optage din stemme. Gå et sted hen, hvor der er mere stille, og prøv igen."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tryk på Næste, når du er klar."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Toneaudiometri"; @@ -295,18 +330,18 @@ /* Timed walk active task. */ "TIMED_WALK_TITLE" = "Gå på tid"; "TIMED_WALK_INTRO_DETAIL" = "Denne aktivitet måler funktionen i dine nedre ekstremiteter."; -"TIMED_WALK_INTRO_2_TEXT_%@" = "Find et sted, helst udenfor, hvor du trygt kan gå omkring i %@ på en lige linje så hurtigt som muligt. Sænk ikke farten, før du har passeret mållinjen."; +"TIMED_WALK_INTRO_2_TEXT_%@" = "Find et sted, helst udenfor, hvor du trygt kan gå omkring i %@ i en lige linje så hurtigt som muligt. Sænk ikke farten, før du har passeret mållinjen."; "TIMED_WALK_INTRO_2_DETAIL" = "Tryk på Næste for at starte."; "TIMED_WALK_FORM_TITLE" = "Hjælpemiddelenhed"; -"TIMED_WALK_FORM_TEXT" = "Brug det samme hjælpemiddelenhed til hver test."; +"TIMED_WALK_FORM_TEXT" = "Brug den samme hjælpemiddelenhed til hver test."; "TIMED_WALK_QUESTION_TEXT" = "Bruger du en ankel-fodortose?"; "TIMED_WALK_QUESTION_2_TITLE" = "Bruger du hjælpemiddelenheder?"; "TIMED_WALK_QUESTION_2_TEXT" = "Tryk her for at vælge et svar."; "TIMED_WALK_QUESTION_2_CHOICE" = "Ingen"; -"TIMED_WALK_QUESTION_2_CHOICE_2" = "En stok"; -"TIMED_WALK_QUESTION_2_CHOICE_3" = "En krykke"; -"TIMED_WALK_QUESTION_2_CHOICE_4" = "To stokke"; -"TIMED_WALK_QUESTION_2_CHOICE_5" = "To krykker"; +"TIMED_WALK_QUESTION_2_CHOICE_2" = "Enkeltsidig stok"; +"TIMED_WALK_QUESTION_2_CHOICE_3" = "Enkeltsidig krykke"; +"TIMED_WALK_QUESTION_2_CHOICE_4" = "Tosidig stok"; +"TIMED_WALK_QUESTION_2_CHOICE_5" = "Tosidig krykke"; "TIMED_WALK_QUESTION_2_CHOICE_6" = "Gangstativ/rollator"; "TIMED_WALK_INSTRUCTION_%@" = "Gå op til %@ i en lige linje."; "TIMED_WALK_INSTRUCTION_2" = "Vend om, og gå tilbage til det sted, hvor du startede."; @@ -327,7 +362,7 @@ /* Hole peg test active task. */ "HOLE_PEG_TEST_TITLE_%@" = "%@-huls Pegtest"; -"HOLE_PEG_TEST_INTRO_TEXT_%@" = "Denne aktivitet måler dine fingerfærdigheder ved at bede dig om at anbringe en cirkel i et hul. Du bliver bedt om at gøre dette %@ gange."; +"HOLE_PEG_TEST_INTRO_TEXT_%@" = "Denne aktivitet måler funktionen i dine øvre ekstremiteter ved at bede dig om at anbringe en pind i et hul. Du bliver bedt om at gøre dette %@ gange."; "HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "Både din venstre og højre hånd testes.\nDu skal samle cirklen op så hurtigt som muligt, anbringe den i hullet, og når det er gjort %@ gange, skal du fjerne den igen %@ gange."; "HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "Både din højre og venstre hånd testes.\nDu skal samle cirklen op så hurtigt som muligt, anbringe den i hullet, og når det er gjort %@ gange, skal du fjerne den igen %@ gange."; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Saml cirklen op vha. to fingre."; "HOLE_PEG_TEST_TEXT_2" = "Løft fingrene for at slippe cirklen."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Aktivitet med rysten"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Denne aktivitet måler dine hænders rysten i forskellige positioner. Find et sted, hvor du kan sidde behageligt under hele aktiviteten."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Hold telefonen i den hånd, der er mest påvirket, som vist på billedet nedenfor."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Hold telefonen i din HØJRE hånd som vist på billedet nedenfor."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Hold telefonen i din VENSTRE hånd som vist på billedet nedenfor."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Du vil blive bedt om at udføre %@, mens du sidder med telefonen i hånden."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "en opgave"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "to opgaver"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tre opgaver"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "fire opgaver"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "fem opgaver"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tryk på næste for at fortsætte."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Gør dig klar til at holde telefonen i skødet."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Gør dig klar til at holde telefonen i skødet med din VENSTRE hånd."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Gør dig klar til at holde telefonen i skødet med din HØJRE hånd."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Bliv ved med at holde din telefon i skødet i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Hold nu din telefon i skulderhøjde med udstrakt arm."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Hold nu din telefon i skulderhøjde med VENSTRE arm udstrakt."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Hold nu din telefon i skulderhøjde med HØJRE arm udstrakt."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Bliv ved med at holde din telefon med udstrakt hånd i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Hold nu din telefon i skulderhøjde med bøjet albue."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Hold nu din telefon med din VENSTRE hånd i skulderhøjde med bøjet albue."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Hold nu din telefon med din HØJRE hånd i skulderhøjde med bøjet albue."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Bliv ved med at holde din telefon med bøjet albue i %ld sekunder"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Hold nu din telefon med bøjet albue, mens du bliver ved med at røre din næse med telefonen."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Hold nu din telefon med bøjet albue i VENSTRE hånd, mens du bliver ved med at røre din næse med telefonen."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Hold nu din telefon med bøjet albue i HØJRE hånd, mens du bliver ved med at røre din næse med telefonen."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Bliv ved med at røre din næse med telefonen i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Gør dig klar til at udføre et dronningevink (vink ved at dreje dit håndled)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Gør dig klar til at udføre et dronningevink (vink ved at dreje dit håndled) med telefonen i VENSTRE hånd."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Gør dig klar til at udføre et dronningevink (vink ved at dreje dit håndled) med telefonen i HØJRE hånd."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Bliv ved med at udføre et dronningevink i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Flyt nu telefonen til din VENSTRE hånd, og fortsæt til næste opgave."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Flyt nu telefonen til din HØJRE hånd, og fortsæt til næste opgave."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Fortsæt til den næste opgave."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivitet færdig."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Du vil blive bedt om at udføre %@, mens du sidder med telefonen først i den ene hånd og derefter igen med telefonen i den anden hånd."; +"TREMOR_SKIP_LEFT_HAND" = "Jeg kan ikke udføre denne aktivitet med min VENSTRE hånd."; +"TREMOR_SKIP_RIGHT_HAND" = "Jeg kan ikke udføre denne aktivitet med min HØJRE hånd."; +"TREMOR_SKIP_NEITHER" = "Jeg kan udføre denne aktivitet med begge hænder."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Kunne ikke oprette arkiv"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Kunne ikke fjerne tilstrækkeligt med logarkiver til at nå grænsen"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Tag billede af eksempel"; "AX_IMAGE_CAPTURED_LABEL" = "Taget billede"; +"AX_VIDEO_CAPTURE_LABEL" = "Eksempel på videooptagelse"; +"AX_VIDEO_CAPTURED_LABEL" = "Optaget video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Kan ikke anbringe ring i størrelse %@ på ring i størrelse %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Mål"; "AX_TOWER_OF_HANOI_TOWER" = "Tårn"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Har ringe med størrelserne %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Tom"; -"AX_GRAPH_RANGE_FORMAT" = "Udsnit fra %@ til %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Udsnit fra %@ til %@"; +"AX_GRAPH_STACK_PREFIX" = "Stak består af"; "AX_GRAPH_AND_SEPARATOR" = " og "; "AX_GRAPH_POINT_%@" = "Punkt: %@"; diff --git a/ResearchKit/Localized/da.lproj/locversion.plist b/ResearchKit/Localized/da.lproj/locversion.plist index 1208026c..e36092d6 100644 --- a/ResearchKit/Localized/da.lproj/locversion.plist +++ b/ResearchKit/Localized/da.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale da LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/de.lproj/ResearchKit.strings b/ResearchKit/Localized/de.lproj/ResearchKit.strings index f09c4f14..32e861f3 100644 --- a/ResearchKit/Localized/de.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/de.lproj/ResearchKit.strings @@ -34,10 +34,10 @@ "CONSENT_NAME_FAMILY" = "Nachname"; "CONSENT_NAME_PLACEHOLDER" = "Erforderlich"; "CONSENT_REVIEW_TITLE" = "Überprüfen"; -"CONSENT_REVIEW_INSTRUCTION" = "Überprüfen Sie das nachstehende Formular und tippen Sie auf „Zustimmen“, wenn Sie bereit sind fortzufahren."; +"CONSENT_REVIEW_INSTRUCTION" = "Überprüfe das nachstehende Formular und tippe auf „Zustimmen“, wenn du bereit bist fortzufahren."; "CONSENT_REVIEW_ALERT_TITLE" = "Überprüfen"; "CONSENT_SIGNATURE_TITLE" = "Unterschrift"; -"CONSENT_SIGNATURE_INSTRUCTION" = "Unterschreiben Sie unten auf der Linie mit Ihrem Finger."; +"CONSENT_SIGNATURE_INSTRUCTION" = "Unterschreibe unten auf der Linie mit deinem Finger."; "CONSENT_SIGNATURE_PLACEHOLDER" = "Hier unterschreiben"; "CONSENT_PAGE_NUMBER_FORMAT" = "Seite %1$ld von %2$ld"; @@ -55,7 +55,7 @@ /* Consent section learn more */ "LEARN_MORE_DATA_GATHERING" = "Weitere Infos über die Erfassung der Daten"; "LEARN_MORE_DATA_USE" = "Weitere Infos über die Verwendung der Daten"; -"LEARN_MORE_PRIVACY" = "Weitere Infos über den Schutz Ihrer Daten und Identität"; +"LEARN_MORE_PRIVACY" = "Weitere Infos über den Schutz deiner Daten und Identität"; "LEARN_MORE_WELCOME" = "Zunächst weitere Infos über diese Studie"; "LEARN_MORE_STUDY_SURVEY" = "Weitere Infos über die Studienumfrage"; "LEARN_MORE_TIME_COMMITMENT" = "Weitere Infos über den für diese Studie benötigten Zeitaufwand"; @@ -66,7 +66,7 @@ "CONSENT_SHARING_TITLE" = "Freigabe-Optionen"; "CONSENT_SHARE_WIDELY_%@" = "Meine Daten für %@ und qualifizierte Forscher auf der ganzen Welt freigeben"; "CONSENT_SHARE_ONLY_%@" = "Meine Daten nur freigeben für „%@“"; -"CONSENT_SHARING_DESCRIPTION_%@" = "Die Studiendaten von Ihrer Teilnahme an dieser Studie werden an %@ weitergegeben.\n\nDie Freigabe Ihrer verschlüsselten Studiendaten (ohne Infos wie z. B. Ihr Name) können für diese und künftige Studienzwecke von Nutzen sein."; +"CONSENT_SHARING_DESCRIPTION_%@" = "Die Studiendaten von deiner Teilnahme an dieser Studie werden an %@ weitergegeben.\n\nDie Freigabe deiner verschlüsselten Studiendaten (ohne Infos wie z. B. dein Name) können für diese und künftige Studienzwecke von Nutzen sein."; "LEARN_MORE_CONSENT_SHARING" = "Weitere Infos zur Datenfreigabe"; /* Lines beneath typewritten signatures on documents. Argument is the title of the signatory, e.g. "Participant's Signature" */ @@ -89,10 +89,10 @@ /* Alerts for invalid location coordinates */ "LOCATION_QUESTION_PLACEHOLDER" = "Eine Adresse eingeben"; "LOCATION_ERROR_TITLE" = "Angegebene Adresse konnte nicht gefunden werden"; -"LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "Der aktuelle Standort konnte nicht ermittelt werden. Geben Sie eine Adresse ein oder begeben Sie sich ggf. an einen Ort mit einem besseren GPS-Signal."; -"LOCATION_ERROR_MESSAGE_DENIED" = "Diese App hat keinen Zugriff auf die Ortungsdienste. Erlauben Sie ihr in den Einstellungen das Verwenden der Ortungsdienste."; -"LOCATION_ERROR_GEOCODE" = "Die eingegebene Adresse konnte nicht gefunden werden. Überprüfen Sie, dass es sich um eine gültige Adresse handelt."; -"LOCATION_ERROR_GEOCODE_NETWORK" = "Es besteht entweder keine Internetverbindung oder Sie haben die höchstmögliche Anzahl an Adresssuchen erreicht. Wenn Sie nicht mit dem Internet verbunden sind, aktivieren Sie WLAN, um diese Frage zu beantworten, oder überspringen Sie sie, wenn die Taste „Überspringen“ angezeigt wird. Sie können auch zur Umfrage zurückkehren, wenn eine Internetverbindung hergestellt wurde. Versuchen Sie es andernfalls zu einem späteren Zeitpunkt erneut."; +"LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "Der aktuelle Standort konnte nicht ermittelt werden. Gib eine Adresse ein oder begib dich ggf. an einen Ort mit einem besseren GPS-Signal."; +"LOCATION_ERROR_MESSAGE_DENIED" = "Diese App hat keinen Zugriff auf die Ortungsdienste. Erlaube ihr in den Einstellungen das Verwenden der Ortungsdienste."; +"LOCATION_ERROR_GEOCODE" = "Die eingegebene Adresse konnte nicht gefunden werden. Überprüfe, dass es sich um eine gültige Adresse handelt."; +"LOCATION_ERROR_GEOCODE_NETWORK" = "Es besteht entweder keine Internetverbindung oder du hast die höchstmögliche Anzahl an Adresssuchen erreicht. Wenn du nicht mit dem Internet verbunden bist, aktiviere WLAN, um diese Frage zu beantworten, oder überspringe sie, wenn die Taste „Überspringen“ angezeigt wird. Du kannst auch zur Umfrage zurückkehren, wenn eine Internetverbindung hergestellt wurde. Versuche es andernfalls zu einem späteren Zeitpunkt erneut."; /* Alert for exceeding length limit in text answer */ "TEXT_ANSWER_EXCEEDING_MAX_LENGTH_ALERT_MESSAGE" = "Textinhalt überschreitet die Maximallänge: %@"; @@ -119,7 +119,7 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "Überprüfung"; "VERIFICATION_STEP_TITLE" = "E‑Mail überprüfen"; -"RESEND_EMAIL_LABEL_MESSAGE" = "Wenn Sie keine E-Mail zur Überprüfung erhalten haben, klicken Sie auf den Link unten, um sie sich erneut senden zu lassen."; +"RESEND_EMAIL_LABEL_MESSAGE" = "Wenn du keine E-Mail zur Überprüfung erhalten hast, klicke auf den Link unten, um sie dir erneut senden zu lassen."; "RESEND_EMAIL_BUTTON_TITLE" = "Bestätigungs-E‑Mail erneut senden"; /* Login step */ @@ -135,12 +135,13 @@ "PASSCODE_NEW_ENTRY_MESSAGE" = "Neuen Code eingeben"; "PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Neuen Code bestätigen"; "PASSCODE_INVALID_ALERT_TITLE" = "Code nicht korrekt"; -"PASSCODE_INVALID_ALERT_MESSAGE" = "Code stimmte nicht überein. Versuchen Sie es erneut."; +"PASSCODE_INVALID_ALERT_MESSAGE" = "Code stimmte nicht überein. Versuche es erneut."; "PASSCODE_TOUCH_ID_MESSAGE" = "Mit Touch ID authentifizieren"; "PASSCODE_TOUCH_ID_ERROR_ALERT_TITLE" = "Touch ID-Fehler"; "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Es sind nur numerische Zeichen zulässig."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Statusanzeige für Codeeingabe"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ von %@ Stellen eingegeben"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Code vergessen?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Schlüsselbundobjekt konnte nicht hinzugefügt werden"; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nein"; "BOOL_YES" = "Ja"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Zum Antworten tippen"; "NULL_ANSWER" = "Antwort wählen"; @@ -189,118 +195,147 @@ "BUTTON_OPTION_SAVE" = "Für später sichern"; "BUTTON_OPTION_DISCARD" = "Ergebnisse löschen"; "BUTTON_OPTION_STOP_TASK" = "Aufgabe beenden"; +"BUTTON_SAVE" = "Sichern"; +"BUTTON_CLEAR_ANSWER" = "Antwort löschen"; +"BUTTON_READ_ONLY_MODE" = "Diese Antwort kann nicht geändert werden."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Aktivität beginnt in"; "TASK_COMPLETE_TITLE" = "Aktivität abgeschlossen"; -"TASK_COMPLETE_TEXT" = "Ihre Daten werden analysiert und Sie werden benachrichtigt, wenn Ihre Ergebnisse bereitstehen."; +"TASK_COMPLETE_TEXT" = "Deine Daten werden analysiert und du wirst benachrichtigt, wenn deine Ergebnisse bereitstehen."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Noch %@ Sekunden."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Bild aufnehmen"; "CAPTURE_BUTTON_RECAPTURE_IMAGE" = "Bild erneut aufnehmen"; "CAPTURE_ERROR_CAMERA_NOT_FOUND" = "Keine Kamera gefunden. Dieser Schritt kann nicht abgeschlossen werden."; -"CAPTURE_ERROR_NO_PERMISSIONS" = "Erlauben Sie der App in den Einstellungen Zugriff auf die Kamera, um diesen Schritt abzuschließen."; +"CAPTURE_ERROR_NO_PERMISSIONS" = "Erlaube der App in den Einstellungen Zugriff auf die Kamera, um diesen Schritt abzuschließen."; "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Es wurde keine Ausgabeverzeichnis für aufgenommene Bilder festgelegt."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Das aufgenommene Bild konnte nicht gesichert werden."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Aufnahme starten"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Aufnahme stoppen"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Video erneut aufnehmen"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Strecke (%@)"; "FITNESS_HEARTRATE_TITLE" = "Herzfrequenz (bpm)"; -"FITNESS_SIT_INSTRUCTION_FORMAT" = "Setzen Sie sich %@ bequem hin."; -"FITNESS_WALK_INSTRUCTION_FORMAT" = "Gehen Sie %@ lang so schnell wie möglich."; -"FITNESS_INTRO_TEXT_FORMAT" = "Mit dieser Aktivität wird Ihre Herzfrequenz kontrolliert und gemessen, wie weit Sie in %1$@ laufen können."; -"FITNESS_INTRO_2_TEXT_FORMAT" = "Gehen Sie draußen %1$@ lang so schnell wie möglich. Setzen Sie sich anschließend %2$@ bequem hin und ruhen Sie sich aus. Tippen Sie zum Starten auf „Los geht’s“."; +"FITNESS_SIT_INSTRUCTION_FORMAT" = "Setze dich %@ bequem hin."; +"FITNESS_WALK_INSTRUCTION_FORMAT" = "Gehe %@ lang so schnell wie möglich."; +"FITNESS_INTRO_TEXT_FORMAT" = "Mit dieser Aktivität wird deine Herzfrequenz kontrolliert und gemessen, wie weit du in %1$@ laufen kannst."; +"FITNESS_INTRO_2_TEXT_FORMAT" = "Gehe draußen %1$@ lang so schnell wie möglich. Setze dich anschließend %2$@ bequem hin und ruhe dich aus. Tippe zum Starten auf „Los geht’s“."; /* Short walk active task. */ "WALK_TASK_TITLE" = "Gang und Gleichgewicht"; -"WALK_INTRO_TEXT" = "Mit dieser Aktivität wird Ihr Gang und Gleichgewichtsinn beim Gehen und Stillstehen getestet. Fahren Sie nur fort, wenn Sie ohne Hilfe sicher gehen können."; -"WALK_INTRO_2_TEXT_%ld" = "Finden Sie eine Stelle, an der Sie sicher und ohne Hilfe etwa %ld Schritte in einer geraden Linie gehen können."; -"WALK_INTRO_2_DETAIL" = "Stecken Sie Ihr iPhone in eine Tasche und folgen Sie den Audioanweisungen."; -"WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Stehen Sie jetzt %@ still."; -"WALK_STAND_INSTRUCTION_FORMAT" = "Stehen Sie %@ still."; -"WALK_RETURN_INSTRUCTION_FORMAT" = "Drehen Sie sich um und gehen Sie zum Ausgangspunkt zurück."; -"WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Gehen Sie bis zu %ld Schritte in einer geraden Linie."; +"WALK_INTRO_TEXT" = "Mit dieser Aktivität wird dein Gang und Gleichgewichtsinn beim Gehen und Stillstehen getestet. Fahre nur fort, wenn du ohne Hilfe sicher gehen kannst."; +"WALK_INTRO_2_TEXT_%ld" = "Finde eine Stelle, an der du sicher und ohne Hilfe etwa %ld Schritte in einer geraden Linie gehen kannst."; +"WALK_INTRO_2_DETAIL" = "Stecke dein iPhone in eine Tasche und folge den Audioanweisungen."; +"WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Stehe jetzt %@ still."; +"WALK_STAND_INSTRUCTION_FORMAT" = "Stehe %@ still."; +"WALK_RETURN_INSTRUCTION_FORMAT" = "Drehe dich um und gehe zum Ausgangspunkt zurück."; +"WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Gehe bis zu %ld Schritte in einer geraden Linie."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Suche einen Ort an dem du sicher in einer geraden Linie vor und zurück gehen kannst. Versuche, ununterbrochen zu gehen, indem du am Ende des Wegs so wendest, als würdest du um ein Hütchen gehen.\n\nAnschließend wirst du aufgefordert, dich einmal im Kreis zu drehen und anschließend mit angelegten Armen etwa schulterbreit still zu stehen."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tippe, wenn du bereit bist, anzufangen.\nStecke dann dein iPhone in eine Tasche und folge den Audioanweisungen."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Gehe in einer geraden Linie %@ weit vor und zurück. Gehe so, wie du normal gehst."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Drehe dich einmal im Kreis und bewege dich dann %@ lang nicht."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Du hast diese Aktivität abgeschlossen."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Tipptempo"; -"TAPPING_INTRO_TEXT" = "Diese Aktivität misst Ihr Tipptempo."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Legen Sie Ihr Telefon auf eine ebene Fläche. Auf dem Bildschirm werden zwei Tasten %@ lang angezeigt. Tippen Sie mit zwei Fingern derselben Hand abwechselnd auf die Tasten."; -"TAPPING_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“."; +"TAPPING_TASK_TITLE_RIGHT" = "Rechte Hand"; +"TAPPING_TASK_TITLE_LEFT" = "Linke Hand"; +"TAPPING_INTRO_TEXT" = "Diese Aktivität misst dein Tipptempo."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Lege dein Telefon auf eine ebene Fläche."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Verwende zwei Finger derselben Hand, um abwechselnd auf die Tasten auf dem Bildschirm zu tippen."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Verwende zwei Finger deiner rechten Hand, um abwechselnd auf die Tasten auf dem Bildschirm zu tippen."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Verwende zwei Finger deiner linken Hand, um abwechselnd auf die Tasten auf dem Bildschirm zu tippen."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Wiederhole den Test nun mit deiner rechten Hand."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Wiederhole den Test nun mit deiner linken Hand."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tippe erst mit einem Finger und dann mit dem anderen. Versuche in möglichst gleichmäßigen Abständen zu tippen. Tippe %@ lang."; +"TAPPING_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tippe auf „Weiter“, um anzufangen."; "TAP_BUTTON_TITLE" = "Tippen"; "TOTAL_TAPS_LABEL" = "Tippanzahl"; -"TAPPING_INSTRUCTION" = "Tippen Sie mit zwei Fingern so schnell wie möglich auf die Tasten."; - +"TAPPING_INSTRUCTION" = "Tippe mit zwei Fingern so gleichmäßig wie möglich auf die Tasten."; +"TAPPING_INSTRUCTION_RIGHT" = "Tippe mit deiner RECHTEN Hand auf die Tasten."; +"TAPPING_INSTRUCTION_LEFT" = "Tippe mit deiner LINKEN Hand auf die Tasten."; +"TAPPING_SKIP_TITLE" = "Diese Hand überspringen"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Stimme"; -"AUDIO_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“."; -"AUDIO_INSTRUCTION" = "Sagen Sie solange wie möglich „Aaaaah“ in das Mikrofon."; -"AUDIO_INTRO_TEXT" = "Holen Sie tief Luft und sagen Sie solange wie möglich und mit gleichbleibender Lautstärke „Aaaaah“ in das Mikrofon, sodass die Audiobalken blau bleiben."; -"AUDIO_INTENDED_USE" = "Mit dieser Aktivität wird Ihre Stimme mit dem Mikrofon im unteren Bereich des iPhone aufgenommen und dann bewertet."; +"AUDIO_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“."; +"AUDIO_INSTRUCTION" = "Sage solange wie möglich „Aaaaah“ in das Mikrofon."; +"AUDIO_INTRO_TEXT" = "Hole tief Luft und sage solange wie möglich und mit gleichbleibender Lautstärke „Aaaaah“ in das Mikrofon, sodass die Audiobalken blau bleiben."; +"AUDIO_INTENDED_USE" = "Mit dieser Aktivität wird deine Stimme mit dem Mikrofon im unteren Bereich des iPhone aufgenommen und dann bewertet."; "AUDIO_TOO_LOUD_LABEL" = "Zu laut"; "AUDIO_GENERIC_ERROR_LABEL" = "Aufnahme von Audiomaterial nicht möglich"; +"AUDIO_LEVEL_CHECK_LABEL" = "Bitte warte, während der Hintergrundgeräuschpegel überprüft wird."; +"AUDIO_TOO_LOUD_MESSAGE" = "Der Hintergrundgeräuschpegel ist zu hoch, um deine Stimme aufzunehmen. Bitte gehe an einen leiseren Ort und versuche es erneut."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tippe auf „Weiter“, wenn du bereit bist."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tonaudiometrie"; -"TONE_AUDIOMETRY_INTENDED_USE" = "Diese Aktivität misst Ihre Fähigkeit, unterschiedliche Töne zu hören."; -"TONE_AUDIOMETRY_INTRO_TEXT" = "Bevor Sie beginnen, sollten Sie Ihre Kopfhörer anschließen und aufsetzen."; -"TONE_AUDIOMETRY_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“."; -"TONE_AUDIOMETRY_PREP_TEXT" = "Sie sollten jetzt einen Ton hören. Passen Sie die Lautstärke mithilfe der Steuerungen an der Seite des Geräts an.\n\nTippen Sie auf die Taste, wenn Sie bereit sind."; -"TONE_AUDIOMETRY_INSTRUCTION" = "Tippen Sie jedes Mal, wenn Sie einen Ton hören, auf die Taste."; +"TONE_AUDIOMETRY_INTENDED_USE" = "Diese Aktivität misst deine Fähigkeit, unterschiedliche Töne zu hören."; +"TONE_AUDIOMETRY_INTRO_TEXT" = "Bevor du beginnst, solltest du deine Kopfhörer anschließen und aufsetzen."; +"TONE_AUDIOMETRY_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“."; +"TONE_AUDIOMETRY_PREP_TEXT" = "Du solltest jetzt einen Ton hören. Passe die Lautstärke mithilfe der Steuerungen an der Seite des Geräts an.\n\nTippe auf die Taste, wenn du bereit bist."; +"TONE_AUDIOMETRY_INSTRUCTION" = "Tippe jedes Mal, wenn du einen Ton hörst, auf die Taste."; "TONE_LABEL_%@_LEFT" = "%@ Hz, Links"; "TONE_LABEL_%@_RIGHT" = "%@ Hz, Rechts"; /* Spatial span memory active task. */ "SPATIAL_SPAN_MEMORY_TITLE" = "Räumliches Gedächtnis"; -"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Mit dieser Aktivität wird Ihr räumliches Kurzzeitgedächtnis gemessen, indem Sie aufgefordert werden, die Reihenfolge, in der die %@ aufleuchten, zu wiederholen."; +"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Mit dieser Aktivität wird dein räumliches Kurzzeitgedächtnis gemessen, indem du aufgefordert wirst, die Reihenfolge, in der die %@ aufleuchten, zu wiederholen."; "SPATIAL_SPAN_MEMORY_TARGET_PLURAL" = "Blumen"; "SPATIAL_SPAN_MEMORY_TARGET_STANDALONE" = "Blumen"; -"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "Einige der %@ werden der Reihe nach aufleuchten. Tippen Sie in derselben Reihenfolge auf diese %@."; -"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_REVERSE_%@" = "Einige der %@ werden der Reihe nach aufleuchten. Tippen Sie in umgekehrter Reihenfolge auf diese %@."; -"SPATIAL_SPAN_MEMORY_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“ und schauen Sie dann genau hin."; +"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "Einige der %@ werden der Reihe nach aufleuchten. Tippe in derselben Reihenfolge auf diese %@."; +"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_REVERSE_%@" = "Einige der %@ werden der Reihe nach aufleuchten. Tippe in umgekehrter Reihenfolge auf diese %@."; +"SPATIAL_SPAN_MEMORY_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“ und schaue dann genau hin."; "MEMORY_GAME_ITEM_COUNT_TITLE_%@" = "%@"; "MEMORY_GAME_SCORE_TITLE" = "Ergebnis"; "MEMORY_GAME_PLAYBACK_TITLE_%@" = "Auf das Aufleuchten der %@ achten"; -"MEMORY_GAME_GAMEPLAY_TITLE_%@" = "Tippen Sie auf die %@ in der Reihenfolge, in der sie aufleuchten"; -"MEMORY_GAME_GAMEPLAY_REVERSE_TITLE_%@" = "Tippen Sie in umgekehrter Reihenfolge auf die %@"; +"MEMORY_GAME_GAMEPLAY_TITLE_%@" = "Tippe auf die %@ in der Reihenfolge, in der sie aufleuchten"; +"MEMORY_GAME_GAMEPLAY_REVERSE_TITLE_%@" = "Tippe in umgekehrter Reihenfolge auf die %@"; "MEMORY_GAME_COMPLETE_TITLE" = "Sequenz abgeschlossen"; -"MEMORY_GAME_COMPLETE_MESSAGE" = "Zum Fortfahren tippen Sie auf „Weiter“."; +"MEMORY_GAME_COMPLETE_MESSAGE" = "Zum Fortfahren tippst du auf „Weiter“"; "MEMORY_GAME_FAILED_TITLE" = "Erneut versuchen"; -"MEMORY_GAME_FAILED_MESSAGE" = "Sie haben es diesmal nicht ganz geschafft. Zum Fortfahren tippen Sie auf „Weiter“."; +"MEMORY_GAME_FAILED_MESSAGE" = "Du hast es diesmal nicht ganz geschafft. Zum Fortfahren tippst du auf „Weiter“."; "MEMORY_GAME_TIMEOUT_TITLE" = "Zeit ist abgelaufen"; -"MEMORY_GAME_TIMEOUT_MESSAGE" = "Die Zeit ist abgelaufen.\nZum Fortfahren tippen Sie auf „Weiter“."; +"MEMORY_GAME_TIMEOUT_MESSAGE" = "Die Zeit ist abgelaufen.\nZum Fortfahren tippst du auf „Weiter“."; "MEMORY_GAME_COMPLETE" = "Spiel abgeschlossen"; "MEMORY_GAME_PAUSED_TITLE" = "Angehalten"; -"MEMORY_GAME_PAUSED_MESSAGE" = "Zum Fortfahren tippen Sie auf „Weiter“."; +"MEMORY_GAME_PAUSED_MESSAGE" = "Zum Fortfahren tippst du auf „Weiter“"; /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "Reaktionszeit"; -"REACTION_TIME_TASK_INTENDED_USE" = "Mit dieser Aktivität wird bewertet, wie lange Sie brauchen, um auf optische Reize zu reagieren."; -"REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Schütteln Sie das Gerät, sobald der blaue Punkt auf dem Bildschirm angezeigt wird. Sie werden %D mal darum gebeten."; -"REACTION_TIME_TASK_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“."; +"REACTION_TIME_TASK_INTENDED_USE" = "Mit dieser Aktivität wird bewertet, wie lange du brauchst, um auf optische Reize zu reagieren."; +"REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Schüttle das Gerät, sobald der blaue Punkt auf dem Bildschirm angezeigt wird. Du wirst %D mal darum gebeten."; +"REACTION_TIME_TASK_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“."; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "Versuch %@ von %@"; -"REACTION_TIME_TASK_ACTIVE_STEP_TITLE" = "Wenn der blaue Kreis angezeigt wird, schütteln Sie das Gerät schnell"; +"REACTION_TIME_TASK_ACTIVE_STEP_TITLE" = "Wenn der blaue Kreis angezeigt wird, schüttle das Gerät schnell"; /* Tower of Hanoi active task */ "TOWER_OF_HANOI_TASK_TITLE" = "Türme von Hanoi"; -"TOWER_OF_HANOI_TASK_INTENDED_USE" = "Diese Aktivität misst Ihre Fähigkeit, Rätsel zu lösen."; -"TOWER_OF_HANOI_TASK_INTRO_TEXT" = "Bewegen Sie den gesamten Stapel in so wenigen Zügen wie möglich auf den markierten Turm."; -"TOWER_OF_HANOI_TASK_TASK_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“"; -"TOWER_OF_HANOI_TASK_ACTIVE_STEP_INTRO_TEXT" = "Lösen Sie das Rätsel"; +"TOWER_OF_HANOI_TASK_INTENDED_USE" = "Diese Aktivität misst deine Fähigkeit, Rätsel zu lösen."; +"TOWER_OF_HANOI_TASK_INTRO_TEXT" = "Bewege den gesamten Stapel in so wenigen Zügen wie möglich auf den markierten Turm."; +"TOWER_OF_HANOI_TASK_TASK_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“"; +"TOWER_OF_HANOI_TASK_ACTIVE_STEP_INTRO_TEXT" = "Löse das Rätsel"; "TOWER_OF_HANOI_TASK_ACTIVE_STEP_PROGRESS_TEXT" = "Anzahl Züge: %@ \n %@"; "TOWER_OF_HANOI_TASK_ACTIVE_STEP_SKIP_BUTTON_TITLE" = "Ich kann dieses Rätsel nicht lösen"; /* Timed walk active task. */ "TIMED_WALK_TITLE" = "Gehen mit Zeitmessung"; -"TIMED_WALK_INTRO_DETAIL" = "Diese Aktivität misst die Funktion Ihrer unteren Extremitäten"; -"TIMED_WALK_INTRO_2_TEXT_%@" = "Finden Sie einen Ort, am besten draußen, an dem Sie sicher ca. %@ so schnell wie möglich in einer geraden Linie gehen können. Werden Sie erst langsamer, wenn Sie das Ziel erreicht haben."; -"TIMED_WALK_INTRO_2_DETAIL" = "Tippen Sie auf „Weiter“, um anzufangen."; +"TIMED_WALK_INTRO_DETAIL" = "Diese Aktivität misst die Funktion deiner unteren Extremitäten"; +"TIMED_WALK_INTRO_2_TEXT_%@" = "Finde einen Ort, am besten draußen, an dem du sicher ca. %@ so schnell wie möglich in einer geraden Linie gehen kannst. Werde erst langsamer, wenn du das Ziel erreicht hast."; +"TIMED_WALK_INTRO_2_DETAIL" = "Tippe auf „Weiter“, um anzufangen."; "TIMED_WALK_FORM_TITLE" = "Gehhilfe"; -"TIMED_WALK_FORM_TEXT" = "Verwenden Sie für jeden Test dieselbe Gehhilfe."; -"TIMED_WALK_QUESTION_TEXT" = "Verwenden Sie eine Unterschenkelorthese?"; -"TIMED_WALK_QUESTION_2_TITLE" = "Verwenden Sie Gehhilfen?"; +"TIMED_WALK_FORM_TEXT" = "Verwende für jeden Test dieselbe Gehhilfe."; +"TIMED_WALK_QUESTION_TEXT" = "Verwendest du eine Unterschenkelorthese?"; +"TIMED_WALK_QUESTION_2_TITLE" = "Verwendest du Gehhilfen?"; "TIMED_WALK_QUESTION_2_TEXT" = "Tippen, um eine Antwort auszuwählen."; "TIMED_WALK_QUESTION_2_CHOICE" = "Ohne"; "TIMED_WALK_QUESTION_2_CHOICE_2" = "Gehstock, eine Seite"; @@ -308,36 +343,78 @@ "TIMED_WALK_QUESTION_2_CHOICE_4" = "Gehstock, beide Seiten"; "TIMED_WALK_QUESTION_2_CHOICE_5" = "Krücken, beide Seiten"; "TIMED_WALK_QUESTION_2_CHOICE_6" = "Rollator"; -"TIMED_WALK_INSTRUCTION_%@" = "Gehen Sie bis zu %@ in einer geraden Linie."; -"TIMED_WALK_INSTRUCTION_2" = "Drehen Sie sich um und gehen Sie zum Ausgangspunkt zurück."; -"TIMED_WALK_INSTRUCTION_TEXT" = "Tippen Sie danach auf „Fertig“."; +"TIMED_WALK_INSTRUCTION_%@" = "Gehe bis zu %@ in einer geraden Linie."; +"TIMED_WALK_INSTRUCTION_2" = "Drehe dich um und gehe zum Ausgangspunkt zurück."; +"TIMED_WALK_INSTRUCTION_TEXT" = "Tippe danach auf „Fertig“."; /* PSAT active task. */ "PASAT_TITLE" = "PASAT"; "PVSAT_TITLE" = "PVSAT"; "PAVSAT_TITLE" = "PAVSAT"; -"PASAT_INTRO_TEXT" = "Der akustische Serienaddiertest mit Zeitlimit (PASAT, Paced Auditory Serial Addition Test) misst, wie schnell Sie akustische Informationen verarbeiten und rechnen können."; -"PVSAT_INTRO_TEXT" = "Der visuelle Serienaddiertest mit Zeitlimit (PASAT, Paced Visual Serial Addition Test) misst, wie schnell Sie optische Informationen verarbeiten und rechnen können."; -"PAVSAT_INTRO_TEXT" = "Der audiovisuelle Serienaddiertest mit Zeitlimit (PAVSAT, Paced Auditory and Visual Serial Addition Test) misst, wie schnell Sie akustische und optische Informationen verarbeiten und rechnen können."; -"PSAT_INTRO_TEXT_2_%@" = "Alle %@ Sekunden wird eine einstellige Zahl angezeigt.\nSie müssen diese Zahl zu der addieren, die direkt zuvor angezeigt wurde.\nAchtung: Sie sollen nicht die Gesamtsumme der Zahlen errechnen, sondern nur die jeweils beiden letzten Zahlen addieren."; -"PSAT_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“."; -"PSAT_INITIAL_INSTRUCTION" = "Merken Sie sich die erste Zahl."; -"PSAT_INSTRUCTION" = "Addieren Sie diese Zahl zur vorherigen."; +"PASAT_INTRO_TEXT" = "Der akustische Serienaddiertest mit Zeitlimit (PASAT, Paced Auditory Serial Addition Test) misst, wie schnell du akustische Informationen verarbeiten und rechnen kannst."; +"PVSAT_INTRO_TEXT" = "Der visuelle Serienaddiertest mit Zeitlimit (PASAT, Paced Visual Serial Addition Test) misst, wie schnell du optische Informationen verarbeiten und rechnen kannst."; +"PAVSAT_INTRO_TEXT" = "Der audiovisuelle Serienaddiertest mit Zeitlimit (PAVSAT, Paced Auditory and Visual Serial Addition Test) misst, wie schnell du akustische und optische Informationen verarbeiten und rechnen kannst."; +"PSAT_INTRO_TEXT_2_%@" = "Alle %@ Sekunden wird eine einstellige Zahl angezeigt.\nDu musst diese Zahl zu der addieren, die direkt zuvor angezeigt wurde.\nAchtung: Du sollst nicht die Gesamtsumme der Zahlen errechnen, sondern nur die jeweils beiden letzten Zahlen addieren."; +"PSAT_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“."; +"PSAT_INITIAL_INSTRUCTION" = "Merke dir die erste Zahl."; +"PSAT_INSTRUCTION" = "Addiere diese Zahl zur vorherigen."; "PSAT_NO_DIGIT" = "-"; /* Hole peg test active task. */ "HOLE_PEG_TEST_TITLE_%@" = "%@-Hole-Peg-Test"; -"HOLE_PEG_TEST_INTRO_TEXT_%@" = "Mit dieser Aktivität wird die Reaktionsfähigkeit Ihrer oberen Extremitäten gemessen, indem Sie aufgefordert werden, einen Kreis auf einem Loch zu platzieren. Das Ganze wird %@-mal wiederholt."; -"HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "Die Reaktionsfähigkeit Ihrer linken und rechten Hand wird getestet.\nBewegen Sie den Kreis mit zwei Fingern so schnell wie möglich auf das Loch. Wenn Sie dies %@-mal getan haben, entfernen Sie ihn %@-mal."; -"HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "Die Reaktionsfähigkeit Ihrer linken und rechten Hand wird getestet.\nBewegen Sie den Kreis mit zwei Fingern so schnell wie möglich auf das Loch. Wenn Sie dies %@-mal getan haben, entfernen Sie ihn %@-mal."; +"HOLE_PEG_TEST_INTRO_TEXT_%@" = "Mit dieser Aktivität wird die Reaktionsfähigkeit deiner oberen Extremitäten gemessen, indem du aufgefordert wirst, einen Kreis auf einem Loch zu platzieren. Das Ganze wird %@-mal wiederholt."; +"HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "Die Reaktionsfähigkeit deiner linken und rechten Hand wird getestet.\nBewege den Kreis mit zwei Fingern so schnell wie möglich auf das Loch. Wenn du dies %@-mal getan hast, entferne ihn %@-mal."; +"HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "Die Reaktionsfähigkeit deiner linken und rechten Hand wird getestet.\nBewege den Kreis mit zwei Fingern so schnell wie möglich auf das Loch. Wenn du dies %@-mal getan hast, entferne ihn %@-mal."; -"HOLE_PEG_TEST_CALL_TO_ACTION" = "Tippen Sie zum Starten auf „Los geht’s“."; -"HOLE_PEG_TEST_PLACE_INSTRUCTION_LEFT_HAND" = "Bewegen Sie den Kreis mit der linken Hand in das Loch."; -"HOLE_PEG_TEST_PLACE_INSTRUCTION_RIGHT_HAND" = "Bewegen Sie den Kreis mit der rechten Hand in das Loch."; -"HOLE_PEG_TEST_REMOVE_INSTRUCTION_LEFT_HAND" = "Bewegen Sie den Kreis mit der linken Hand hinter die Linie."; -"HOLE_PEG_TEST_REMOVE_INSTRUCTION_RIGHT_HAND" = "Bewegen Sie den Kreis mit der rechten Hand hinter die Linie."; -"HOLE_PEG_TEST_TEXT" = "Bewegen Sie den Kreis mit zwei Fingern."; -"HOLE_PEG_TEST_TEXT_2" = "Heben Sie den Finger, um den Kreis auf die Zielposition zu setzen."; +"HOLE_PEG_TEST_CALL_TO_ACTION" = "Tippe zum Starten auf „Los geht’s“."; +"HOLE_PEG_TEST_PLACE_INSTRUCTION_LEFT_HAND" = "Bewege den Kreis mit der linken Hand in das Loch."; +"HOLE_PEG_TEST_PLACE_INSTRUCTION_RIGHT_HAND" = "Bewege den Kreis mit der rechten Hand in das Loch."; +"HOLE_PEG_TEST_REMOVE_INSTRUCTION_LEFT_HAND" = "Bewege den Kreis mit der linken Hand hinter die Linie."; +"HOLE_PEG_TEST_REMOVE_INSTRUCTION_RIGHT_HAND" = "Bewege den Kreis mit der rechten Hand hinter die Linie."; +"HOLE_PEG_TEST_TEXT" = "Bewege den Kreis mit zwei Fingern."; +"HOLE_PEG_TEST_TEXT_2" = "Hebe den Finger, um den Kreis auf die Zielposition zu setzen."; + +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Zitteraktivität"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Mit dieser Aktivität wird gemessen, wie sehr deine Hände in unterschiedlichen Haltungen zittern. Führe diese Aktivität an einem Ort durch, an dem du währenddessen bequem sitzen kannst."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Halte dein Telefon in der stärker betroffenen Hand, wie unten im Bild zu sehen."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Halte dein Telefon in der RECHTEN Hand, wie unten im Bild zu sehen."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Halte dein Telefon in der LINKEN Hand, wie unten im Bild zu sehen."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Du wirst aufgefordert %@ durchzuführen, während du sitzend dein Telefon in der Hand hältst."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "eine Aufgabe"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "zwei Aufgaben"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "drei Aufgaben"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "vier Aufgaben"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "fünf Aufgaben"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tippe auf „Weiter“, um fortzufahren."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Bereite dich darauf vor, dein Telefon im Schoß zu halten."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Bereite dich darauf vor, dein Telefon mit der LINKEN Hand im Schoß zu halten."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Bereite dich darauf vor, dein Telefon mit der RECHTEN Hand im Schoß zu halten."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Halte %ld Sekunden lang dein Telefon in deinem Schoß."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Halte dein Telefon nun mit ausgestreckter Hand in Schulterhöhe."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Halte dein Telefon nun mit ausgestreckter LINKER Hand in Schulterhöhe."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Halte dein Telefon nun mit ausgestreckter RECHTER Hand in Schulterhöhe."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Halte mit ausgestreckter Hand %ld Sekunden lang dein Telefon."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Halte dein Telefon nun mit angewinkelten Ellenbogen in Schulterhöhe."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Halte dein Telefon nun in deiner LINKEN Hand mit angewinkeltem Ellenbogen in Schulterhöhe."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Halte dein Telefon nun in deiner RECHTEN Hand mit angewinkeltem Ellenbogen in Schulterhöhe."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Halte mit angewinkelten Ellenbogen %ld Sekunden lang dein Telefon"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Winkle nun deinen Ellenbogen an und berühre wiederholt mit deinem Telefon deine Nase."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Winkle nun deinen Ellenbogen an, halte dein Telefon in der LINKEN Hand und berühre wiederholt mit deinem Telefon deine Nase."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Winkle nun deinen Ellenbogen an, halte dein Telefon in der RECHTEN Hand und berühre wiederholt mit deinem Telefon deine Nase."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Halte dein Telefon %ld Sekunden lang an deine Nase"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Bereite dich darauf vor, zu winken, indem du dein Handgelenk drehst."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Bereite dich darauf vor, mit dem Telefon in deiner LINKEN Hand zu winken, indem du dein Handgelenk drehst."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Bereite dich darauf vor, mit dem Telefon in deiner RECHTEN Hand zu winken, indem du dein Handgelenk drehst."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Winke %ld Sekunden lang."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Wechsle nun zu deiner LINKEN Hand und fahre mit der nächsten Aufgabe fort."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Wechsle nun zu deiner RECHTEN Hand und fahre mit der nächsten Aufgabe fort."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Weiter zur nächsten Aufgabe."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivität abgeschlossen."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Du wirst aufgefordert %@ durchzuführen, während du sitzend dein Telefon zuerst in der einen, dann in der anderen Hand hältst."; +"TREMOR_SKIP_LEFT_HAND" = "Ich kann diese Aktivität mit meiner LINKEN Hand nicht durchführen."; +"TREMOR_SKIP_RIGHT_HAND" = "Ich kann diese Aktivität mit meiner RECHTEN Hand nicht durchführen."; +"TREMOR_SKIP_NEITHER" = "Ich kann diese Aktivität mit beiden Händen durchführen."; /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Fehler beim Erstellen der Datei"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Vorschau aufnehmen"; "AX_IMAGE_CAPTURED_LABEL" = "Aufgenommenes Bild"; +"AX_VIDEO_CAPTURE_LABEL" = "Videoaufnahmenvorschau"; +"AX_VIDEO_CAPTURED_LABEL" = "Aufgenommenes Video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Die Scheibe der Größe %@ kann nicht auf die Scheibe der Größe %@ gelegt werden"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Ziel"; "AX_TOWER_OF_HANOI_TOWER" = "Turm"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Mit Scheiben in den Größen %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Leer"; -"AX_GRAPH_RANGE_FORMAT" = "Bereich von %@ bis %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Bereich von %@ bis %@"; +"AX_GRAPH_STACK_PREFIX" = "Stapel besteht aus"; "AX_GRAPH_AND_SEPARATOR" = " und "; "AX_GRAPH_POINT_%@" = "Punkt: %@"; diff --git a/ResearchKit/Localized/de.lproj/locversion.plist b/ResearchKit/Localized/de.lproj/locversion.plist index b8b79b3e..1f64b249 100644 --- a/ResearchKit/Localized/de.lproj/locversion.plist +++ b/ResearchKit/Localized/de.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale de LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/el.lproj/ResearchKit.strings b/ResearchKit/Localized/el.lproj/ResearchKit.strings index 4aff99fb..93986870 100644 --- a/ResearchKit/Localized/el.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/el.lproj/ResearchKit.strings @@ -120,7 +120,7 @@ "VERIFICATION_NAV_TITLE" = "Επαλήθευση"; "VERIFICATION_STEP_TITLE" = "Επαληθεύστε το email σας"; "RESEND_EMAIL_LABEL_MESSAGE" = "Αν δεν έχετε λάβει email επαλήθευσης, αγγίξτε τον παρακάτω σύνδεσμο για να σταλεί ξανά."; -"RESEND_EMAIL_BUTTON_TITLE" = "Εκ νέου αποστολή email επιβεβαίωσης"; +"RESEND_EMAIL_BUTTON_TITLE" = "Νέα αποστολή email επιβεβαίωσης"; /* Login step */ "LOGIN_CONTINUE_BUTTON_TITLE" = "Είσοδος"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Επιτρέπονται μόνο αριθμητικοί χαρακτήρες."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Ένδειξη προόδου εισαγωγής συνθηματικού"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Εισάχθηκαν %@ από %@ ψηφία"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Ξεχάσατε το συνθηματικό;"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Δεν ήταν δυνατή η προσθήκη στοιχείου της Κλειδοθήκης."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Όχι"; "BOOL_YES" = "Ναι"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "εκ."; +"MEASURING_UNIT_FT" = "πδ"; +"MEASURING_UNIT_IN" = "ίντσ."; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Αγγίξτε για απάντηση"; "NULL_ANSWER" = "Επιλέξτε μια απάντηση"; @@ -188,20 +194,29 @@ "BUTTON_START_TIMER" = "Έναρξη χρονοδιακόπτη"; "BUTTON_OPTION_SAVE" = "Αποθήκευση για αργότερα"; "BUTTON_OPTION_DISCARD" = "Απόρριψη αποτελεσμάτων"; -"BUTTON_OPTION_STOP_TASK" = "Τέλος δοκιμής"; +"BUTTON_OPTION_STOP_TASK" = "Τέλος εργασίας"; +"BUTTON_SAVE" = "Αποθήκευση"; +"BUTTON_CLEAR_ANSWER" = "Εκκαθάριση απάντησης"; +"BUTTON_READ_ONLY_MODE" = "Δεν είναι δυνατή η τροποποίηση αυτής της απάντησης."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Έναρξη δραστηριότητας σε"; "TASK_COMPLETE_TITLE" = "Η δραστηριότητα ολοκληρώθηκε"; "TASK_COMPLETE_TEXT" = "Τα δεδομένα σας θα αναλυθούν και θα ειδοποιηθείτε όταν είναι έτοιμα τα αποτελέσματα."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Απομένουν %@ δευτερόλεπτα."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Καταγραφή εικόνας"; "CAPTURE_BUTTON_RECAPTURE_IMAGE" = "Επανάληψη καταγραφής εικόνας"; "CAPTURE_ERROR_CAMERA_NOT_FOUND" = "Δεν βρέθηκε κάμερα. Δεν είναι δυνατή η ολοκλήρωση αυτού του βήματος."; "CAPTURE_ERROR_NO_PERMISSIONS" = "Για να ολοκληρώσετε αυτό το βήμα, επιτρέψτε σε αυτήν την εφαρμογή να προσπελάζει την κάμερα στις Ρυθμίσεις."; -"CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Δεν καθορίστηκε κατάλογος εξόδου για καταγεγραμμένες εικόνες."; -"CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Δεν ήταν δυνατή η αποθήκευση της καταγεγραμμένης εικόνας."; +"CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Δεν καθορίστηκε κατάλογος εξόδου για καταγραμμένες εικόνες."; +"CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Δεν ήταν δυνατή η αποθήκευση της καταγραμμένης εικόνας."; + +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Έναρξη εγγραφής"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Διακοπή εγγραφής"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Εκ νέου καταγραφή βίντεο"; /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Φυσική κατάσταση"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Γυρίστε πίσω και περπατήστε μέχρι το σημείο όπου αρχίσατε."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Περπατήστε έως %ld βήματα σε ευθεία γραμμή."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Βρείτε έναν χώρο όπου μπορείτε να περπατήσετε με ασφάλεια μπρος-πίσω σε ευθεία γραμμή. Προσπαθήστε να μη διακόψετε το βάδισμα, στρίβοντας στο τέλος της γραμμής και επιστρέφοντας πάλι εκεί που αρχίσατε και πάλι το ίδιο, σαν να περπατάτε γύρω από έναν κώνο.\n\nΚατόπιν, θα σας ζητηθεί να κάνετε μια πλήρη στροφή γύρω από τον εαυτό σας και μετά να σταθείτε ακίνητοι με τα χέρια ευθεία κάτω στο πλάι του σώματος και τα πόδια σας ανοιχτά σε απόσταση παρόμοια των ώμων σας."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Αγγίξτε «Έναρξη» όταν είστε έτοιμοι να ξεκινήσετε.\nΜετά, τοποθετήστε το τηλέφωνό σας στην τσέπη ή την τσάντα σας και ακολουθήστε τις ηχητικές οδηγίες."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Περπατήστε μπρος-πίσω σε ευθεία γραμμή για %@ στον συνηθισμένο σας ρυθμό."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Κάντε μια πλήρη στροφή γύρω από τον εαυτό σας και μετά μείνετε ακίνητοι για %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Ολοκληρώσατε τη δραστηριότητα."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Ταχύτητα αγγίγματος"; +"TAPPING_TASK_TITLE_RIGHT" = "Δεξιό χέρι"; +"TAPPING_TASK_TITLE_LEFT" = "Αριστερό χέρι"; "TAPPING_INTRO_TEXT" = "Αυτή η δραστηριότητα αξιολογεί την ταχύτητα αγγιγμάτων σας."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Ακουμπήστε το τηλέφωνό σας σε μια επίπεδη επιφάνεια. Θα εμφανιστούν δύο κουμπιά στην οθόνη σας για %@. Χρησιμοποιήστε δύο δάχτυλα του ίδιου χεριού για να αγγίζετε εναλλάξ τα κουμπιά όσο πιο γρήγορα μπορείτε."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Τοποθετήστε το τηλέφωνο σε επίπεδη επιφάνεια."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Χρησιμοποιήστε δύο δάχτυλα του ίδιου χεριού για εναλλάξ άγγιγμα των κουμπιών στην οθόνη."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Χρησιμοποιήστε δύο δάχτυλα του δεξιού χεριού για εναλλάξ άγγιγμα των κουμπιών στην οθόνη."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Χρησιμοποιήστε δύο δάχτυλα του αριστερού χεριού για εναλλάξ άγγιγμα των κουμπιών στην οθόνη."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Τώρα επαναλάβετε την ίδια δοκιμή με το δεξιό σας χέρι."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Τώρα επαναλάβετε την ίδια δοκιμή με το αριστερό σας χέρι."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Αγγίξτε με το ένα δάχτυλο και μετά με το άλλο. Προσπαθήστε ώστε ο χρόνος μεταξύ των αγγιγμάτων να είναι όσο το δυνατόν ίδιος. Συνεχίστε τα αγγίγματα για %@."; "TAPPING_CALL_TO_ACTION" = "Αγγίξτε «Έναρξη» για να αρχίσετε."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Αγγίξτε «Επόμενο» για να ξεκινήσετε."; "TAP_BUTTON_TITLE" = "Αγγίξτε"; "TOTAL_TAPS_LABEL" = "Συνολικά αγγίγματα"; -"TAPPING_INSTRUCTION" = "Αγγίξτε τα κουμπιά όσο πιο γρήγορα μπορείτε χρησιμοποιώντας δύο δάχτυλα."; - +"TAPPING_INSTRUCTION" = "Αγγίξτε τα κουμπιά χρησιμοποιώντας δύο δάχτυλα και φροντίστε ο χρόνος μεταξύ των αγγιγμάτων να είναι όσο το δυνατόν ίδιος."; +"TAPPING_INSTRUCTION_RIGHT" = "Αγγίξτε τα κουμπιά χρησιμοποιώντας το ΔΕΞΙΟ σας χέρι."; +"TAPPING_INSTRUCTION_LEFT" = "Αγγίξτε τα κουμπιά χρησιμοποιώντας το ΑΡΙΣΤΕΡΟ σας χέρι."; +"TAPPING_SKIP_TITLE" = "Παράλειψη αυτού του χεριού"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Φωνή"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Αυτή η δραστηριότητα αξιολογεί τη φωνή σας μέσω εγγραφής ενώ μιλάτε στο μικρόφωνο που βρίσκεται στο κάτω μέρος του τηλεφώνου."; "AUDIO_TOO_LOUD_LABEL" = "Πολύ δυνατά"; "AUDIO_GENERIC_ERROR_LABEL" = "Δεν είναι δυνατή η εγγραφή ήχου"; +"AUDIO_LEVEL_CHECK_LABEL" = "Περιμένετε μέχρι να ελεγχθεί το επίπεδο θορύβου υποβάθρου."; +"AUDIO_TOO_LOUD_MESSAGE" = "Το επίπεδο περιβαλλοντικού θορύβου είναι πολύ υψηλό για εγγραφή της φωνής σας. Πηγαίνετε σε έναν χώρο με λιγότερο θόρυβο και προσπαθήστε πάλι."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Αγγίξτε «Επόμενο» όταν είστε έτοιμοι."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Τονική ακοομετρία"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Σηκώστε τoν κύκλο με δύο δάχτυλα."; "HOLE_PEG_TEST_TEXT_2" = "Σηκώστε τα δάχτυλα για να αφήσετε τον κύκλο."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Δραστηριότητα τρέμουλου"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Αυτή η δραστηριότητα μετρά το τρέμουλο των χεριών σας σε διάφορες θέσεις. Βρείτε ένα σημείο όπου μπορείτε να κάθεστε άνετα καθ' όλη τη διάρκεια της δραστηριότητας."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Κρατήστε το τηλέφωνο στο πιο επηρεαζόμενο χέρι σας όπως φαίνεται στην παρακάτω εικόνα."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Κρατήστε το τηλέφωνο στο ΔΕΞΙΟ χέρι σας όπως φαίνεται στην παρακάτω εικόνα."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Κρατήστε το τηλέφωνο στο ΑΡΙΣΤΕΡΟ χέρι σας όπως φαίνεται στην παρακάτω εικόνα."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Θα σας ζητηθεί να εκτελέσετε %@ σε θέση καθίσματος με το τηλέφωνο στο χέρι σας."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "μια εργασία"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "δύο εργασίες"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "τρεις εργασίες"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "τέσσερις εργασίες"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "πέντε εργασίες"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Αγγίξτε «Επόμενο» για να συνεχίσετε."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Προετοιμαστείτε να κρατήσετε το τηλέφωνο πάνω στα πόδια σας."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Προετοιμαστείτε να κρατήσετε το τηλέφωνο πάνω στα πόδια σας με το ΑΡΙΣΤΕΡΟ χέρι."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Προετοιμαστείτε να κρατήσετε το τηλέφωνο πάνω στα πόδια σας με το ΔΕΞΙΟ χέρι."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Συνεχίστε να κρατάτε το τηλέφωνο πάνω στα πόδια σας για %ld δευτερόλεπτα."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Τώρα κρατήστε το τηλέφωνο στο χέρι σας τεντωμένο στο ύψος του ώμου."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Τώρα κρατήστε το τηλέφωνο στο ΑΡΙΣΤΕΡΟ χέρι τεντωμένο στο ύψος του ώμου."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Τώρα κρατήστε το τηλέφωνο στο ΔΕΞΙΟ χέρι τεντωμένο στο ύψος του ώμου."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Συνεχίστε να κρατάτε το τηλέφωνο με το τεντωμένο χέρι σας για %ld δευτερόλεπτα."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Τώρα κρατήστε το τηλέφωνο στο ύψος του ώμου με τον αγκώνα λυγισμένο."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Τώρα κρατήστε το τηλέφωνο στο ΑΡΙΣΤΕΡΟ χέρι τεντωμένο στο ύψος του ώμου με τον αγκώνα λυγισμένο."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Τώρα κρατήστε το τηλέφωνο στο ΔΕΞΙΟ χέρι τεντωμένο στο ύψος του ώμου με τον αγκώνα λυγισμένο."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Συνεχίστε να κρατάτε το τηλέφωνο με λυγισμένο τον αγκώνα για %ld δευτερόλεπτα."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Κρατώντας τον αγκώνα σας λυγισμένο, αγγίξτε τη μύτη σας με το τηλέφωνο επανειλημμένα."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Κρατώντας τον αγκώνα σας λυγισμένο με το τηλέφωνο στο ΑΡΙΣΤΕΡΟ χέρι σας, αγγίξτε τη μύτη σας με το τηλέφωνο επανειλημμένα."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Κρατώντας τον αγκώνα σας λυγισμένο με το τηλέφωνο στο ΔΕΞΙΟ χέρι σας, αγγίξτε τη μύτη σας με το τηλέφωνο επανειλημμένα."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Συνεχίστε να ακουμπάτε τη μύτη σας με το τηλέφωνο για %ld δευτερόλεπτα."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Προετοιμαστείτε να κάνετε έναν βασιλικό χαιρετισμό (κουνώντας τον καρπό)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Προετοιμαστείτε να κάνετε έναν βασιλικό χαιρετισμό με το τηλέφωνο στο ΑΡΙΣΤΕΡΟ χέρι σας (χαιρετίστε κουνώντας τον καρπό)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Προετοιμαστείτε να κάνετε έναν βασιλικό χαιρετισμό με το τηλέφωνο στο ΔΕΞΙΟ χέρι σας (χαιρετίστε κουνώντας τον καρπό)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Συνεχίστε να χαιρετάτε με αυτόν τον τρόπο για %ld δευτερόλεπτα."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Τώρα κρατήστε το τηλέφωνο στο ΑΡΙΣΤΕΡΟ χέρι σας και συνεχίστε στην επόμενη εργασία."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Τώρα κρατήστε το τηλέφωνο στο ΔΕΞΙΟ χέρι σας και συνεχίστε στην επόμενη εργασία."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Συνεχίστε στην επόμενη εργασία."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Η δραστηριότητα ολοκληρώθηκε."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Θα σας ζητηθεί να εκτελέσετε %@ σε θέση καθίσματος με το τηλέφωνο πρώτα στο ένα χέρι και μετά στο άλλο."; +"TREMOR_SKIP_LEFT_HAND" = "Δεν μπορώ να εκτελέσω αυτήν τη δραστηριότητα με το ΑΡΙΣΤΕΡΟ χέρι μου."; +"TREMOR_SKIP_RIGHT_HAND" = "Δεν μπορώ να εκτελέσω αυτήν τη δραστηριότητα με το ΔΕΞΙΟ χέρι μου."; +"TREMOR_SKIP_NEITHER" = "Μπορώ να εκτελέσω αυτήν τη δραστηριότητα και με τα δύο χέρια."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Δεν ήταν δυνατή η δημιουργία αρχείου"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Δεν ήταν δυνατή η αφαίρεση επαρκών αρχείων καταγραφής για την επίτευξη ορίου"; @@ -376,7 +453,10 @@ "AX.MEMORY.TILE.LABEL" = "Πλακίδιο παιχνιδιού μνήμης"; "AX_IMAGE_CAPTURE_LABEL" = "Προεπισκόπηση καταγραφής"; -"AX_IMAGE_CAPTURED_LABEL" = "Καταγεγραμμένη εικόνα"; +"AX_IMAGE_CAPTURED_LABEL" = "Καταγραμμένη εικόνα"; + +"AX_VIDEO_CAPTURE_LABEL" = "Προεπισκόπηση καταγραφής βίντεο"; +"AX_VIDEO_CAPTURED_LABEL" = "Καταγραμμένο βίντεο"; "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Δεν είναι δυνατή η τοποθέτηση δίσκου μεγέθους %@ πάνω σε δίσκο μεγέθους %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Στόχος"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Έχει δίσκο με μεγέθη %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Κενός"; -"AX_GRAPH_RANGE_FORMAT" = "Εύρος από %@ έως %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Εύρος από %@ έως %@"; +"AX_GRAPH_STACK_PREFIX" = "Η στοίβα αποτελείται από"; "AX_GRAPH_AND_SEPARATOR" = " και "; "AX_GRAPH_POINT_%@" = "Σημείο: %@"; diff --git a/ResearchKit/Localized/el.lproj/locversion.plist b/ResearchKit/Localized/el.lproj/locversion.plist index 157eed15..7f6b3911 100644 --- a/ResearchKit/Localized/el.lproj/locversion.plist +++ b/ResearchKit/Localized/el.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale el LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/en.lproj/ResearchKit.strings b/ResearchKit/Localized/en.lproj/ResearchKit.strings index 64a6bab1..ea7b3e5c 100644 --- a/ResearchKit/Localized/en.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/en.lproj/ResearchKit.strings @@ -213,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "No output directory was specified for captured images."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "The captured image could not be saved."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Start Recording"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stop Recording"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapture Video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distance (%@)"; @@ -450,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Capture preview"; "AX_IMAGE_CAPTURED_LABEL" = "Captured image"; +"AX_VIDEO_CAPTURE_LABEL" = "Video capture preview"; +"AX_VIDEO_CAPTURE_COMPLETE" = "Video capture complete"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Unable to place disk with size %@ on disk with size %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Target"; "AX_TOWER_OF_HANOI_TOWER" = "Tower"; @@ -462,3 +470,5 @@ "AX_GRAPH_STACK_PREFIX" = "Stack composed of"; "AX_GRAPH_AND_SEPARATOR" = " and "; "AX_GRAPH_POINT_%@" = "Point: %@"; + +"AX_AUDIO_BAR_GRAPH" = "Audio Bar Graph"; diff --git a/ResearchKit/Localized/en.lproj/locversion.plist b/ResearchKit/Localized/en.lproj/locversion.plist index 6d121256..23fa3d9b 100644 --- a/ResearchKit/Localized/en.lproj/locversion.plist +++ b/ResearchKit/Localized/en.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale en LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/en_AU.lproj/ResearchKit.strings b/ResearchKit/Localized/en_AU.lproj/ResearchKit.strings index 8dae3799..0b326507 100644 --- a/ResearchKit/Localized/en_AU.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/en_AU.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Only numeric characters allowed."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Passcode entry progress indicator"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ of %@ digits entered"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Forgot Passcode?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Could not add Keychain item."; @@ -167,6 +168,11 @@ "BOOL_NO" = "No"; "BOOL_YES" = "Yes"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Tap to answer"; "NULL_ANSWER" = "Select an answer"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Save for Later"; "BUTTON_OPTION_DISCARD" = "Discard Results"; "BUTTON_OPTION_STOP_TASK" = "End Task"; +"BUTTON_SAVE" = "Save"; +"BUTTON_CLEAR_ANSWER" = "Clear answer"; +"BUTTON_READ_ONLY_MODE" = "This answer cannot be modified."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Starting activity in"; "TASK_COMPLETE_TITLE" = "Activity Complete"; "TASK_COMPLETE_TEXT" = "Your data will be analysed and you will be notified when your results are ready."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ seconds remaining."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capture Image"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "No output directory was specified for captured images."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "The captured image could not be saved."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Start Recording"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stop Recording"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapture Video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distance (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Turn around and walk back to where you started."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Walk up to %ld steps in a straight line."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Find a place where you can safely walk back and forth in a straight line. Try to walk continuously by turning at the ends of your path, as if you are walking around a cone.\n\nNext you will be instructed to turn around in a full circle, then stand still with your arms at your sides and your feet about shoulder-width apart."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tap Get Started when you are ready to begin.\nThen place your phone in a pocket or bag and follow the audio instructions."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Walk back and forth in a straight line for %@. Walk as you would normally."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Turn in a full circle and then stand still for %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "You have completed the activity."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Tapping Speed"; +"TAPPING_TASK_TITLE_RIGHT" = "Right Hand"; +"TAPPING_TASK_TITLE_LEFT" = "Left Hand"; "TAPPING_INTRO_TEXT" = "This activity measures your tapping speed."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Rest your phone on a flat surface. Two buttons will appear on your screen for %@. Using two fingers on the same hand, take turns tapping the buttons as quickly as you can."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Put your phone on a flat surface."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Use two fingers on the same hand to alternately tap the buttons on the screen."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Use two fingers on your right hand to alternately tap the buttons on the screen."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Use two fingers on your left hand to alternately tap the buttons on the screen."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Now repeat the same test using your right hand."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Now repeat the same test using your left hand."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tap one finger, then the other. Try to time your taps to be as even as possible. Keep tapping for %@."; "TAPPING_CALL_TO_ACTION" = "Tap Get Started to begin."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tap Next to begin."; "TAP_BUTTON_TITLE" = "Tap"; "TOTAL_TAPS_LABEL" = "Total Taps"; -"TAPPING_INSTRUCTION" = "Tap the buttons as quickly as you can using two fingers."; - +"TAPPING_INSTRUCTION" = "Tap the buttons as consistently as you can using two fingers."; +"TAPPING_INSTRUCTION_RIGHT" = "Tap the buttons using your RIGHT hand."; +"TAPPING_INSTRUCTION_LEFT" = "Tap the buttons using your LEFT hand."; +"TAPPING_SKIP_TITLE" = "Skip this hand"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voice"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "This activity evaluates your voice by recording it with the microphone at the bottom of your phone."; "AUDIO_TOO_LOUD_LABEL" = "Too Loud"; "AUDIO_GENERIC_ERROR_LABEL" = "Unable to record audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Please wait while we check the background noise level."; +"AUDIO_TOO_LOUD_MESSAGE" = "The ambient noise level is too loud to record your voice. Please move somewhere quieter and try again."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tap Next when ready."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tone Audiometry"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Pick up the peg using two fingers."; "HOLE_PEG_TEST_TEXT_2" = "Lift fingers to drop the peg."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremor Activity"; +"TREMOR_TEST_INTRO_1_DETAIL" = "This activity measures the tremor of your hands in various positions. Find a place where you can sit comfortably for the duration of this activity."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Hold the phone in your more affected hand as shown in the image below."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Hold the phone in your RIGHT hand as shown in the image below."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Hold the phone in your LEFT hand as shown in the image below."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "You will be asked to perform %@ while sitting with the phone in your hand."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "a task"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "two tasks"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "three tasks"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "four tasks"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "five tasks"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tap next to proceed."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepare to hold your phone in your lap."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepare to hold your phone in your lap with your LEFT hand."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepare to hold your phone in your lap with your RIGHT hand."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Keep holding your phone in your lap for %ld seconds."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Now hold your phone with your hand extended out at shoulder height."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Now hold your phone with your LEFT hand extended out at shoulder height."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Now hold your phone with your RIGHT hand extended out at shoulder height."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Keep holding your phone with your hand extended for %ld seconds."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Now hold your phone at shoulder height with your elbow bent."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Now hold your phone with your LEFT hand at shoulder height with your elbow bent."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Now hold your phone with your RIGHT hand at shoulder height with your elbow bent."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Keep holding your phone with your elbow bent for %ld seconds"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Now keeping your elbow bent, touch your phone to your nose repeatedly."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Now keeping your elbow bent with your phone in your LEFT hand, touch your phone to your nose repeatedly."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Now keeping your elbow bent with your phone in your RIGHT hand, touch your phone to your nose repeatedly."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Keep touching your phone to your nose for %ld seconds"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepare to do a queen wave (wave by turning your wrist)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepare to do a queen wave with your phone in your LEFT hand (wave by turning your wrist)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepare to do a queen wave with your phone in your RIGHT hand (wave by turning your wrist)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Keep performing a queen wave for %ld seconds."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Now switch the phone to your LEFT hand and continue to the next task."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Now switch the phone to your RIGHT hand and continue to the next task."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Continue to the next task."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activity completed."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "You will be asked to perform %@ while sitting with the phone first in one hand, then again with the other hand."; +"TREMOR_SKIP_LEFT_HAND" = "I cannot perform this activity with my LEFT hand."; +"TREMOR_SKIP_RIGHT_HAND" = "I cannot perform this activity with my RIGHT hand."; +"TREMOR_SKIP_NEITHER" = "I can perform this activity with both hands."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Could not create file"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Could not remove sufficient log files to reach threshold"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Capture preview"; "AX_IMAGE_CAPTURED_LABEL" = "Captured image"; +"AX_VIDEO_CAPTURE_LABEL" = "Video capture preview"; +"AX_VIDEO_CAPTURED_LABEL" = "Captured video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Unable to place disk with size %@ on disk with size %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Target"; "AX_TOWER_OF_HANOI_TOWER" = "Tower"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Has disk with sizes %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Empty"; -"AX_GRAPH_RANGE_FORMAT" = "Range from %@ to %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Range from %@ to %@"; +"AX_GRAPH_STACK_PREFIX" = "Stack composed of"; "AX_GRAPH_AND_SEPARATOR" = " and "; "AX_GRAPH_POINT_%@" = "Point: %@"; diff --git a/ResearchKit/Localized/en_AU.lproj/locversion.plist b/ResearchKit/Localized/en_AU.lproj/locversion.plist index 5f7d3339..2ac37edc 100644 --- a/ResearchKit/Localized/en_AU.lproj/locversion.plist +++ b/ResearchKit/Localized/en_AU.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale en_AU LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/en_GB.lproj/ResearchKit.strings b/ResearchKit/Localized/en_GB.lproj/ResearchKit.strings index 18ed4423..7ac6779a 100644 --- a/ResearchKit/Localized/en_GB.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/en_GB.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Only numeric characters allowed."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Passcode entry progress indicator"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ of %@ digits entered"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Forgot Passcode?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Could not add Keychain item."; @@ -167,6 +168,11 @@ "BOOL_NO" = "No"; "BOOL_YES" = "Yes"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Tap to answer"; "NULL_ANSWER" = "Select an answer"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Save for Later"; "BUTTON_OPTION_DISCARD" = "Discard Results"; "BUTTON_OPTION_STOP_TASK" = "End Task"; +"BUTTON_SAVE" = "Save"; +"BUTTON_CLEAR_ANSWER" = "Clear answer"; +"BUTTON_READ_ONLY_MODE" = "This answer cannot be modified."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Starting activity in"; "TASK_COMPLETE_TITLE" = "Activity Complete"; "TASK_COMPLETE_TEXT" = "Your data will be analysed and you will be notified when your results are ready."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ seconds remaining."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capture Image"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "No output directory was specified for captured images."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "The captured image could not be saved."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Start Recording"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stop Recording"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapture Video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distance (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Turn round and walk back to where you started."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Walk up to %ld steps in a straight line."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Find a place where you can safely walk back and forth in a straight line. Try to walk continuously by turning at the ends of your path, as if you are walking around a cone.\n\nNext you will be instructed to turn around in a full circle, then stand still with your arms at your sides and your feet about shoulder-width apart."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tap Get Started when you are ready to begin.\nThen place your phone in a pocket or bag and follow the audio instructions."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Walk back and forth in a straight line for %@. Walk as you would normally."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Turn in a full circle and then stand still for %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "You have completed the activity."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Tapping Speed"; +"TAPPING_TASK_TITLE_RIGHT" = "Right Hand"; +"TAPPING_TASK_TITLE_LEFT" = "Left Hand"; "TAPPING_INTRO_TEXT" = "This activity measures your tapping speed."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Rest your phone on a flat surface. Two buttons will appear on your screen for %@. Using two fingers on the same hand, take turns tapping the buttons as quickly as you can."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Put your phone on a flat surface."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Use two fingers on the same hand to alternately tap the buttons on the screen."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Use two fingers on your right hand to alternately tap the buttons on the screen."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Use two fingers on your left hand to alternately tap the buttons on the screen."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Now repeat the same test using your right hand."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Now repeat the same test using your left hand."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tap one finger, then the other. Try to time your taps to be as even as possible. Keep tapping for %@."; "TAPPING_CALL_TO_ACTION" = "Tap Get Started to begin."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tap Next to begin."; "TAP_BUTTON_TITLE" = "Tap"; "TOTAL_TAPS_LABEL" = "Total Taps"; -"TAPPING_INSTRUCTION" = "Tap the buttons as quickly as you can using two fingers."; - +"TAPPING_INSTRUCTION" = "Tap the buttons as consistently as you can using two fingers."; +"TAPPING_INSTRUCTION_RIGHT" = "Tap the buttons using your RIGHT hand."; +"TAPPING_INSTRUCTION_LEFT" = "Tap the buttons using your LEFT hand."; +"TAPPING_SKIP_TITLE" = "Skip this hand"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voice"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "This activity evaluates your voice by recording it with the microphone at the bottom of your phone."; "AUDIO_TOO_LOUD_LABEL" = "Too Loud"; "AUDIO_GENERIC_ERROR_LABEL" = "Unable to record audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Please wait while we check the background noise level."; +"AUDIO_TOO_LOUD_MESSAGE" = "The ambient noise level is too loud to record your voice. Please move somewhere quieter and try again."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tap Next when ready."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tone Audiometry"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Pick up the peg using two fingers."; "HOLE_PEG_TEST_TEXT_2" = "Lift fingers to drop the peg."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremor Activity"; +"TREMOR_TEST_INTRO_1_DETAIL" = "This activity measures the tremor of your hands in various positions. Find a place where you can sit comfortably for the duration of this activity."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Hold the phone in your more affected hand as shown in the image below."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Hold the phone in your RIGHT hand as shown in the image below."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Hold the phone in your LEFT hand as shown in the image below."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "You will be asked to perform %@ while sitting with the phone in your hand."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "a task"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "two tasks"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "three tasks"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "four tasks"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "five tasks"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tap next to proceed."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepare to hold your phone in your lap."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepare to hold your phone in your lap with your LEFT hand."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepare to hold your phone in your lap with your RIGHT hand."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Keep holding your phone in your lap for %ld seconds."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Now hold your phone with your hand extended out at shoulder height."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Now hold your phone with your LEFT hand extended out at shoulder height."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Now hold your phone with your RIGHT hand extended out at shoulder height."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Keep holding your phone with your hand extended for %ld seconds."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Now hold your phone at shoulder height with your elbow bent."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Now hold your phone with your LEFT hand at shoulder height with your elbow bent."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Now hold your phone with your RIGHT hand at shoulder height with your elbow bent."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Keep holding your phone with your elbow bent for %ld seconds"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Now keeping your elbow bent, touch your phone to your nose repeatedly."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Now keeping your elbow bent with your phone in your LEFT hand, touch your phone to your nose repeatedly."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Now keeping your elbow bent with your phone in your RIGHT hand, touch your phone to your nose repeatedly."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Keep touching your phone to your nose for %ld seconds"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepare to do a queen wave (wave by turning your wrist)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepare to do a queen wave with your phone in your LEFT hand (wave by turning your wrist)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepare to do a queen wave with your phone in your RIGHT hand (wave by turning your wrist)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Keep performing a queen wave for %ld seconds."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Now switch the phone to your LEFT hand and continue to the next task."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Now switch the phone to your RIGHT hand and continue to the next task."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Continue to the next task."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activity completed."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "You will be asked to perform %@ while sitting with the phone first in one hand, then again with the other hand."; +"TREMOR_SKIP_LEFT_HAND" = "I cannot perform this activity with my LEFT hand."; +"TREMOR_SKIP_RIGHT_HAND" = "I cannot perform this activity with my RIGHT hand."; +"TREMOR_SKIP_NEITHER" = "I can perform this activity with both hands."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Could not create file"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Could not remove sufficient log files to reach threshold"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Capture preview"; "AX_IMAGE_CAPTURED_LABEL" = "Captured image"; +"AX_VIDEO_CAPTURE_LABEL" = "Video capture preview"; +"AX_VIDEO_CAPTURED_LABEL" = "Captured video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Unable to place disk with size %@ on disk with size %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Target"; "AX_TOWER_OF_HANOI_TOWER" = "Tower"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Has disk with sizes %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Empty"; -"AX_GRAPH_RANGE_FORMAT" = "Range from %@ to %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Range from %@ to %@"; +"AX_GRAPH_STACK_PREFIX" = "Stack composed of"; "AX_GRAPH_AND_SEPARATOR" = " and "; "AX_GRAPH_POINT_%@" = "Point: %@"; diff --git a/ResearchKit/Localized/en_GB.lproj/locversion.plist b/ResearchKit/Localized/en_GB.lproj/locversion.plist index b5f8dceb..6b675816 100644 --- a/ResearchKit/Localized/en_GB.lproj/locversion.plist +++ b/ResearchKit/Localized/en_GB.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale en_GB LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/es.lproj/ResearchKit.strings b/ResearchKit/Localized/es.lproj/ResearchKit.strings index 05a829eb..bb0c07fa 100644 --- a/ResearchKit/Localized/es.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/es.lproj/ResearchKit.strings @@ -34,7 +34,7 @@ "CONSENT_NAME_FAMILY" = "Apellidos"; "CONSENT_NAME_PLACEHOLDER" = "Obligatorio"; "CONSENT_REVIEW_TITLE" = "Revisar"; -"CONSENT_REVIEW_INSTRUCTION" = "Revisa el formulario siguiente y pulsa Acepto si estás listo para continuar."; +"CONSENT_REVIEW_INSTRUCTION" = "Revisa el siguiente formulario y pulsa Acepto si estás listo para continuar."; "CONSENT_REVIEW_ALERT_TITLE" = "Revisar"; "CONSENT_SIGNATURE_TITLE" = "Firma"; "CONSENT_SIGNATURE_INSTRUCTION" = "Firma con el dedo sobre la línea de abajo."; @@ -89,8 +89,8 @@ /* Alerts for invalid location coordinates */ "LOCATION_QUESTION_PLACEHOLDER" = "Introduce una dirección"; "LOCATION_ERROR_TITLE" = "No se ha encontrado la dirección especificada"; -"LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "No se ha podido determinar su ubicación actual. Escriba una dirección o diríjase a una ubicación donde la señal GPS sea mejor."; -"LOCATION_ERROR_MESSAGE_DENIED" = "Se ha denegado el acceso a los servicios de localización. Vaya a Ajustes para conceder a esta app permiso para utilizar los servicios de localización."; +"LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "No se ha podido determinar tu ubicación actual. Escribe una dirección o dirígete a una ubicación donde la señal GPS sea mejor."; +"LOCATION_ERROR_MESSAGE_DENIED" = "Se ha denegado el acceso a los servicios de localización. Ve a Ajustes para conceder a esta aplicación permiso para utilizar los servicios de localización."; "LOCATION_ERROR_GEOCODE" = "No se ha encontrado ningún resultado para la dirección introducida. Asegúrate de que la dirección es válida."; "LOCATION_ERROR_GEOCODE_NETWORK" = "O bien no estás conectado a Internet o bien has excedido el número máximo de búsquedas de direcciones. Si no estás conectado a Internet, activa la conexión Wi-Fi para responder a esta pregunta, omítela si el botón de omisión está disponible, o vuelve al estudio cuando dispongas de conexión a Internet. Si no es posible, inténtalo de nuevo dentro de unos minutos."; @@ -119,12 +119,12 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "Verificación"; "VERIFICATION_STEP_TITLE" = "Verifica tu correo electrónico"; -"RESEND_EMAIL_LABEL_MESSAGE" = "Pulsa en el enlace siguiente si no has recibido un mensaje de correo de verificación y quieres que se te vuelva a enviar."; +"RESEND_EMAIL_LABEL_MESSAGE" = "Pulsa en el enlace siguiente si no has recibido un correo de verificación y quieres que se te vuelva a enviar."; "RESEND_EMAIL_BUTTON_TITLE" = "Reenviar correo de verificación"; /* Login step */ "LOGIN_CONTINUE_BUTTON_TITLE" = "Iniciar sesión"; -"FORGOT_PASSWORD_BUTTON_TITLE" = "¿Ha olvidado su contraseña?"; +"FORGOT_PASSWORD_BUTTON_TITLE" = "¿Has olvidado tu contraseña?"; /* Passcode step */ "PASSCODE_PROMPT_MESSAGE" = "Introduce el código"; @@ -133,14 +133,15 @@ "PASSCODE_AUTHENTICATED_MESSAGE" = "Autenticado por código"; "PASSCODE_OLD_ENTRY_MESSAGE" = "Introduce el código antiguo"; "PASSCODE_NEW_ENTRY_MESSAGE" = "Introduce el código nuevo"; -"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Confirme el nuevo código"; +"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Confirma el nuevo código"; "PASSCODE_INVALID_ALERT_TITLE" = "Código incorrecto"; "PASSCODE_INVALID_ALERT_MESSAGE" = "Los códigos no coinciden. Inténtalo de nuevo."; -"PASSCODE_TOUCH_ID_MESSAGE" = "Autentíquese con Touch ID"; +"PASSCODE_TOUCH_ID_MESSAGE" = "Autentícate con Touch ID"; "PASSCODE_TOUCH_ID_ERROR_ALERT_TITLE" = "Error de Touch ID"; "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Solo se admiten caracteres numéricos."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicador de progreso de introducción de código"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ de %@ dígitos introducidos"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "¿Has olvidado el código?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "No se ha podido añadir el ítem del llavero."; @@ -167,6 +168,11 @@ "BOOL_NO" = "No"; "BOOL_YES" = "Sí"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Pulsa para contestar"; "NULL_ANSWER" = "Selecciona una respuesta"; @@ -189,49 +195,75 @@ "BUTTON_OPTION_SAVE" = "Guardar para luego"; "BUTTON_OPTION_DISCARD" = "Descartar resultados"; "BUTTON_OPTION_STOP_TASK" = "Finalizar tarea"; +"BUTTON_SAVE" = "Guardar"; +"BUTTON_CLEAR_ANSWER" = "Borrar respuesta"; +"BUTTON_READ_ONLY_MODE" = "Esta respuesta no puede modificarse."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Iniciando actividad en"; "TASK_COMPLETE_TITLE" = "Actividad completada"; "TASK_COMPLETE_TEXT" = "Se analizarán tus datos y recibirás los resultados cuando estén listos."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Quedan %@ segundos."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturar imagen"; "CAPTURE_BUTTON_RECAPTURE_IMAGE" = "Volver a capturar imagen"; "CAPTURE_ERROR_CAMERA_NOT_FOUND" = "No se ha encontrado ninguna cámara. Este paso no se puede completar."; -"CAPTURE_ERROR_NO_PERMISSIONS" = "Para completar este paso, ve a Ajustes para conceder a la app acceso a la cámara."; +"CAPTURE_ERROR_NO_PERMISSIONS" = "Para completar este paso, ve a Ajustes para conceder a la aplicación acceso a la cámara."; "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "No se ha especificado ningún directorio de salida para las imágenes capturadas."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "No se ha podido guardar la imagen capturada."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Iniciar grabación"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Detener grabación"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Volver a capturar vídeo"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Forma física"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distancia (%@)"; -"FITNESS_HEARTRATE_TITLE" = "Frecuencia cardiaca (ppm)"; +"FITNESS_HEARTRATE_TITLE" = "Frecuencia cardíaca (ppm)"; "FITNESS_SIT_INSTRUCTION_FORMAT" = "Siéntate cómodamente durante %@."; "FITNESS_WALK_INSTRUCTION_FORMAT" = "Camina lo más rápido que puedas durante %@."; -"FITNESS_INTRO_TEXT_FORMAT" = "Esta actividad controla tu frecuencia cardiaca y mide la distancia que puedes recorrer andando en %1$@."; +"FITNESS_INTRO_TEXT_FORMAT" = "Esta actividad controla tu frecuencia cardíaca y mide la distancia que puedes recorrer andando en %1$@."; "FITNESS_INTRO_2_TEXT_FORMAT" = "Camina al aire libre lo más rápido que puedas durante %1$@. Transcurrido este tiempo, siéntate y descansa durante %2$@. Para comenzar, pulsa Empezar."; /* Short walk active task. */ "WALK_TASK_TITLE" = "Marcha y equilibrio"; -"WALK_INTRO_TEXT" = "Esta actividad mide tu forma de andar y tu equilibrio al caminar y al permanecer quieto de pie. No sigas adelante si no puedes caminar de forma segura sin ayuda."; -"WALK_INTRO_2_TEXT_%ld" = "Busca un lugar en el que puedas dar de forma segura sin ayuda unos %ld pasos en línea recta."; +"WALK_INTRO_TEXT" = "Esta actividad mide tu forma de andar, tu equilibrio al caminar y al permanecer quieto de pie. No sigas adelante si no puedes caminar de forma segura sin ayuda."; +"WALK_INTRO_2_TEXT_%ld" = "Busca un lugar en el que puedas dar unos %ld pasos en línea recta de forma segura sin ayuda."; "WALK_INTRO_2_DETAIL" = "Guárdate el teléfono en un bolsillo o un bolso y sigue las instrucciones de audio."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Ahora permanece quieto de pie durante %@."; "WALK_STAND_INSTRUCTION_FORMAT" = "Permanece quieto de pie durante %@."; "WALK_RETURN_INSTRUCTION_FORMAT" = "Da la vuelta y camina hasta el punto de partida."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Da unos %ld pasos en línea recta."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Busca un lugar en el que puedas caminar de un lado a otro en línea recta de forma segura. Camina sin parar y da la vuelta al final del recorrido, como si rodearas un cono.\n\nA continuación, se te indicará que gires sobre ti mismo dando una vuelta completa y que te quedes quieto con los brazos relajados a los lados del cuerpo y los pies separados de forma que estén alineados con los hombros."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Pulsa Empezar cuando estés preparado para comenzar.\nA continuación, guarda el teléfono en un bolsillo o en una bolsa y sigue las instrucciones de audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Camina de un lado a otro en línea recta durante %@. Camina como lo harías normalmente."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Gira sobre ti mismo dando una vuelta completa y quédate quieto durante %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Has acabado la actividad."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Velocidad de pulsación"; +"TAPPING_TASK_TITLE_RIGHT" = "Mano derecha"; +"TAPPING_TASK_TITLE_LEFT" = "Mano izquierda"; "TAPPING_INTRO_TEXT" = "Esta actividad mide tu velocidad de pulsación."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Coloca el teléfono sobre una superficie plana. En la pantalla aparecerán dos botones durante %@ y, con dos dedos de la misma mano, deberás pulsarlos alternativamente lo más rápido que puedas."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Coloca el teléfono sobre una superficie plana."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Utiliza dos dedos de la misma mano para pulsar de forma alternativa los botones de la pantalla."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Utiliza dos dedos de la mano derecha para pulsar de forma alternativa los botones de la pantalla."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Utiliza dos dedos de la mano izquierda para pulsar de forma alternativa los botones de la pantalla."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Ahora repite la prueba, pero con la mano derecha."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Ahora repite la prueba, pero con la mano izquierda."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Pulsa con un dedo y luego con el otro. Intenta calcular el tiempo entre pulsación y pulsación para que sea lo más regular posible. Sigue pulsando durante %@."; "TAPPING_CALL_TO_ACTION" = "Pulsa Empezar para comenzar."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Pulsa Siguiente para empezar."; "TAP_BUTTON_TITLE" = "Pulsar"; "TOTAL_TAPS_LABEL" = "N.º total de pulsaciones"; -"TAPPING_INSTRUCTION" = "Pulsa los botones lo más rápido que puedas utilizando dos dedos."; - +"TAPPING_INSTRUCTION" = "Pulsa los botones a un ritmo que sea lo más constante posible utilizando dos dedos."; +"TAPPING_INSTRUCTION_RIGHT" = "Pulsa los botones con la mano derecha."; +"TAPPING_INSTRUCTION_LEFT" = "Pulsa los botones con la mano izquierda."; +"TAPPING_SKIP_TITLE" = "Omitir esta mano"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voz"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Esta actividad evalúa tu voz grabándola con el micrófono situado en la parte inferior del teléfono."; "AUDIO_TOO_LOUD_LABEL" = "Demasiado alto"; "AUDIO_GENERIC_ERROR_LABEL" = "No se puede grabar el audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Espera mientras se comprueba el nivel de ruido de fondo."; +"AUDIO_TOO_LOUD_MESSAGE" = "Hay demasiado ruido ambiental para grabar tu voz. Ve a un lugar más tranquilo y vuelve a intentarlo."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Pulsa Siguiente cuando estés preparado."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometría tonal"; @@ -299,7 +334,7 @@ "TIMED_WALK_INTRO_2_DETAIL" = "Pulsa Siguiente para empezar."; "TIMED_WALK_FORM_TITLE" = "Dispositivo de ayuda"; "TIMED_WALK_FORM_TEXT" = "Utiliza el mismo dispositivo de ayuda en cada prueba."; -"TIMED_WALK_QUESTION_TEXT" = "¿Utilizas una ortesis de pie y tobillo?"; +"TIMED_WALK_QUESTION_TEXT" = "¿Utilizas una órtesis de pie y tobillo?"; "TIMED_WALK_QUESTION_2_TITLE" = "¿Utilizas algún dispositivo de ayuda?"; "TIMED_WALK_QUESTION_2_TEXT" = "Pulsa aquí para responder."; "TIMED_WALK_QUESTION_2_CHOICE" = "Ninguno"; @@ -319,7 +354,7 @@ "PASAT_INTRO_TEXT" = "La prueba de suma seriada auditiva por pasos mide tu velocidad de procesamiento de información auditiva y tu capacidad de cálculo."; "PVSAT_INTRO_TEXT" = "La prueba de suma seriada visual por pasos mide tu velocidad de procesamiento de información visual y tu capacidad de cálculo."; "PAVSAT_INTRO_TEXT" = "La prueba de suma seriada auditiva y visual por pasos mide tu velocidad de procesamiento de información auditiva y visual y tu capacidad de cálculo."; -"PSAT_INTRO_TEXT_2_%@" = "Cada %@ segundos se muestra un dígito.\nDebes sumar cada dígito nuevo al anterior.\nAtención: No debes calcular la suma total de todos los dígitos, sino solo la suma de los dos últimos números."; +"PSAT_INTRO_TEXT_2_%@" = "Cada %@ segundos se muestra un dígito.\nDebes sumar cada dígito nuevo al anterior.\nAtención: no debes calcular la suma total de todos los dígitos, sino solo la suma de los dos últimos números."; "PSAT_CALL_TO_ACTION" = "Pulsa Empezar para comenzar."; "PSAT_INITIAL_INSTRUCTION" = "Recuerda este primer dígito."; "PSAT_INSTRUCTION" = "Suma este otro dígito al anterior."; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Coge la clavija con dos dedos."; "HOLE_PEG_TEST_TEXT_2" = "Levanta los dedos para soltar la clavija."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Actividad para medir el temblor"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Esta actividad mide el temblor de las manos en diferentes posiciones. Busca un lugar en el que puedas estar sentado cómodamente durante el tiempo que dure esta actividad."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Aguanta el teléfono en la mano más afectada como se muestra en la imagen siguiente."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Aguanta el teléfono en la mano derecha como se muestra en la imagen siguiente."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Aguanta el teléfono en la mano izquierda como se muestra en la imagen siguiente."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Se te solicitará que realices %@ mientras estás sentado con el teléfono en la mano."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "una tarea"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dos tareas"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tres tareas"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "cuatro tareas"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinco tareas"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Pulsa Siguiente para continuar."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepárate para aguantar el teléfono en el regazo."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepárate para aguantar el teléfono en la mano izquierda apoyada en el regazo."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepárate para aguantar el teléfono en la mano derecha apoyada en el regazo."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Sigue aguantando el teléfono en el regazo durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Ahora aguanta el teléfono con la mano extendida hacia arriba a la altura del hombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Ahora aguanta el teléfono con la mano izquierda extendida hacia arriba a la altura del hombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Ahora aguanta el teléfono con la mano derecha extendida hacia arriba a la altura del hombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Sigue aguantando el teléfono con la mano extendida durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Ahora aguanta el teléfono a la altura del hombro con el codo doblado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Ahora, aguanta el teléfono con la mano izquierda a la altura del hombro con el codo doblado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Ahora, aguanta el teléfono con la mano derecha a la altura del hombro con el codo doblado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Sigue aguantando el teléfono con el codo doblado durante %ld segundos"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Ahora, sin dejar de tener el codo doblado, toca el móvil con la nariz acercándotelo a la cara repetidamente."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Ahora, sin dejar de tener el codo doblado y con el teléfono en la mano izquierda, toca el móvil con la nariz acercándotelo a la cara repetidamente."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Ahora, sin dejar de tener el codo doblado y con el teléfono en la mano derecha, toca el móvil con la nariz acercándotelo a la cara repetidamente."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Sigue tocando el móvil con la nariz acercándotelo a la cara durante %ld segundos"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepárate para girar la muñeca a modo de saludo."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepárate para girar la muñeca a modo de saludo con el teléfono en la mano izquierda."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepárate para girar la muñeca a modo de saludo con el teléfono en la mano derecha."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Sigue girando la muñeca durante %ld segundos a modo de saludo."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Ahora cambia el teléfono a la mano izquierda y continúa con la tarea siguiente."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Ahora cambia el teléfono a la mano derecha y continúa con la tarea siguiente."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Continúa con la tarea siguiente."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Actividad completada."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Se te solicitará que realices %@ mientras estás sentado, primero con el teléfono en una mano y luego en la otra."; +"TREMOR_SKIP_LEFT_HAND" = "No puedo realizar esta actividad con la mano izquierda."; +"TREMOR_SKIP_RIGHT_HAND" = "No puedo realizar esta actividad con la mano derecha."; +"TREMOR_SKIP_NEITHER" = "Puedo realizar esta actividad con las dos manos."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "No se ha podido crear el archivo"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "No se han podido eliminar los archivos de registro suficientes para alcanzar el umbral"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Previsualización de la captura"; "AX_IMAGE_CAPTURED_LABEL" = "Imagen capturada"; +"AX_VIDEO_CAPTURE_LABEL" = "Previsualización de la captura de vídeo"; +"AX_VIDEO_CAPTURED_LABEL" = "Vídeo capturado"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "No se puede colocar un disco de tamaño %@ en un disco de tamaño %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Objetivo"; "AX_TOWER_OF_HANOI_TOWER" = "Torre"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Tiene discos de tamaño %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Vacía"; -"AX_GRAPH_RANGE_FORMAT" = "Rango de valores de %@ a %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Rango de valores de %@ a %@"; +"AX_GRAPH_STACK_PREFIX" = "Grupo compuesto por"; "AX_GRAPH_AND_SEPARATOR" = " y "; "AX_GRAPH_POINT_%@" = "Punto: %@"; diff --git a/ResearchKit/Localized/es.lproj/locversion.plist b/ResearchKit/Localized/es.lproj/locversion.plist index 0f8e37b2..86cebe8d 100644 --- a/ResearchKit/Localized/es.lproj/locversion.plist +++ b/ResearchKit/Localized/es.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale es LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/es_MX.lproj/ResearchKit.strings b/ResearchKit/Localized/es_MX.lproj/ResearchKit.strings index 348c1a95..f3d25044 100644 --- a/ResearchKit/Localized/es_MX.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/es_MX.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Solo se permiten caracteres numéricos."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicador del progreso de ingreso de código"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ de %@ dígitos ingresados"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "¿Olvidaste el código?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "No se pudo agregar el elemento de Llavero."; @@ -167,6 +168,11 @@ "BOOL_NO" = "No"; "BOOL_YES" = "Sí"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "pie(s)"; +"MEASURING_UNIT_IN" = "pulg."; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Toca para contestar"; "NULL_ANSWER" = "Seleccionar una respuesta"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Guardar para después"; "BUTTON_OPTION_DISCARD" = "Descartar resultados"; "BUTTON_OPTION_STOP_TASK" = "Finalizar tarea"; +"BUTTON_SAVE" = "Guardar"; +"BUTTON_CLEAR_ANSWER" = "Borrar respuesta"; +"BUTTON_READ_ONLY_MODE" = "No se puede modificar esta respuesta."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Comenzar la actividad en"; "TASK_COMPLETE_TITLE" = "Actividad completada"; "TASK_COMPLETE_TEXT" = "Se analizarán tus datos y se te avisará cuando tus resultados estén listos."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Quedan %@ segundos."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturar imagen"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "No se especificó un directorio de salida para las imágenes capturadas."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "No se pudo guardar la imagen capturada."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Iniciar grabación"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Detener grabación"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapturar video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Condición"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distancia (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Da vuelta y regresa al punto de inicio."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Da hasta %ld pasos en línea recta."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Busca un lugar en donde puedas caminar de forma segura de un lado a otro en una línea recta. Intenta caminar sin detenerte al final, como si giraras alrededor de un cono.\n\nDespués se te pedirá que hagas una vuelta completa sobre tu eje y que te quedes quieto con los brazos a los lados y los pies separados y alineados con tus hombros."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Toca Empezar cuando estés listo.\nLuego coloca el teléfono en un bolsillo o bolsa y sigue las instrucciones de audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Camina de un lado a otro en una línea recta por %@. Camina como lo harías normalmente."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Da una vuelta completa sobre tu eje y quédate quieto por %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Completaste la actividad."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Velocidad al tocar"; +"TAPPING_TASK_TITLE_RIGHT" = "Mano derecha"; +"TAPPING_TASK_TITLE_LEFT" = "Mano izquierda"; "TAPPING_INTRO_TEXT" = "Esta actividad mide tu velocidad al tocar."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Coloca el teléfono sobre una superficie plana. Se mostrarán dos botones en la pantalla durante %@. Usando dos dedos de una misma mano, toca alternadamente los botones tan rápido como puedas."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Coloca tu teléfono en una superficie plana."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Usa dos dedos de la misma mano para tocar alternativamente los botones de la pantalla."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Usa dos dedos de la mano derecha para tocar alternativamente los botones de la pantalla."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Usa dos dedos de la mano izquierda para tocar alternativamente los botones de la pantalla."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Ahora repite la prueba con la mano derecha."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Ahora repite la prueba con la mano izquierda."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Toca con un dedo y luego con el otro. Intenta calcular el tiempo entre cada toque para que sea lo más constante posible. Sigue tocando por %@."; "TAPPING_CALL_TO_ACTION" = "Toca Empezar para comenzar."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Toca Siguiente para comenzar."; "TAP_BUTTON_TITLE" = "Tocar"; "TOTAL_TAPS_LABEL" = "Toques en total"; -"TAPPING_INSTRUCTION" = "Toca los botones usando dos dedos tan rápido como puedas."; - +"TAPPING_INSTRUCTION" = "Toca los botones lo más constante que puedas usando dos dedos."; +"TAPPING_INSTRUCTION_RIGHT" = "Toca los botones usando tu mano derecha."; +"TAPPING_INSTRUCTION_LEFT" = "Toca los botones usando tu mano izquierda."; +"TAPPING_SKIP_TITLE" = "Omitir esta mano"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voz"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Esta actividad evalúa tu voz grabándola con el micrófono en la parte inferior de tu teléfono."; "AUDIO_TOO_LOUD_LABEL" = "Demasiado fuerte"; "AUDIO_GENERIC_ERROR_LABEL" = "No se pudo grabar audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Espera mientras revisamos el nivel de ruido de fondo."; +"AUDIO_TOO_LOUD_MESSAGE" = "Hay mucho ruido ambiental como para grabar tu voz. Ve a un lugar más tranquilo y reintenta."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Toca Siguiente cuando estés listo."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometría tonal"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Recoge la estaca con dos dedos."; "HOLE_PEG_TEST_TEXT_2" = "Levanta los dedos para soltar la estaca."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Actividad para temblores"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Esta actividad mide cuánto tiemblan tus manos en varias posiciones. Busca un lugar en donde te puedas sentar cómodamente durante esta actividad."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Agarra el teléfono con tu mano más afectada como se muestra en la imagen."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Agarra el teléfono con tu mano derecha como se muestra en la imagen."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Agarra el teléfono con tu mano izquierda como se muestra en la imagen."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Se te pedirá que realices %@ mientras estás sentado con el teléfono en la mano."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "una tarea"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dos tareas"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tres tareas"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "cuatro tareas"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinco tareas"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Toca Siguiente para continuar."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepárate para sostener el teléfono sobre tu pierna."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepárate para sostener el teléfono sobre tu pierna con tu mano izquierda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepárate para sostener el teléfono sobre tu pierna con tu mano derecha."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Sigue sosteniendo el teléfono sobre tu pierna por %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Ahora agarra el teléfono con la mano extendida a la altura de los hombros."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Ahora agarra el teléfono con tu mano izquierda extendida a la altura de los hombros."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Ahora agarra el teléfono con tu mano derecha extendida a la altura de los hombros."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Sigue sosteniendo el teléfono con tu mano extendida por %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Ahora agarra el teléfono a la altura de los hombros con el codo doblado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Ahora agarra el teléfono con tu mano izquierda a la altura de los hombros con el codo doblado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Ahora agarra el teléfono con tu mano derecha a la altura de los hombros con el codo doblado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Sigue sosteniendo el teléfono con tu codo doblado por %ld segundos"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Ahora, aún con el codo doblado, acerca y toca el teléfono con tu nariz varias veces."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Ahora, aún con el codo doblado y sosteniendo el teléfono con tu mano izquierda, acerca y toca el teléfono con tu nariz varias veces."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Ahora, aún con el codo doblado y sosteniendo el teléfono con tu mano derecha, acerca y toca el teléfono con tu nariz varias veces."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Sigue acercando y tocando el teléfono con tu nariz por %ld segundos"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepárate para hacer un gesto de saludo (girando la muñeca)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepárate para hacer un gesto de saludo (girando la muñeca) con tu teléfono en la mano izquierda."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepárate para hacer un gesto de saludo (girando la muñeca) con tu teléfono en la mano derecha."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Sigue haciendo un gesto de saludo por %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Ahora cambia el teléfono a tu mano izquierda y pasa a la siguiente tarea."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Ahora cambia el teléfono a tu mano derecha y pasa a la siguiente tarea."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Pasa a la siguiente tarea."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Actividad completada."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Se te pedirá que realices %@ mientras estás sentado, primero con el teléfono en una mano y luego en la otra."; +"TREMOR_SKIP_LEFT_HAND" = "No puedo realizar esta actividad con mi mano izquierda."; +"TREMOR_SKIP_RIGHT_HAND" = "No puedo realizar esta actividad con mi mano derecha."; +"TREMOR_SKIP_NEITHER" = "Puedo realizar esta actividad con las dos manos."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "No se pudo crear el archivo"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "No se pudo eliminar suficientes registros para alcanzar el umbral"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Previsualización de captura"; "AX_IMAGE_CAPTURED_LABEL" = "Imagen capturada"; +"AX_VIDEO_CAPTURE_LABEL" = "Previsualización de captura de video"; +"AX_VIDEO_CAPTURED_LABEL" = "Vídeo capturado"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "No se puede colocar un disco de tamaño %@ sobre otro de tamaño %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Destino"; "AX_TOWER_OF_HANOI_TOWER" = "Torre"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Tiene discos de tamaño %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Vacía"; -"AX_GRAPH_RANGE_FORMAT" = "Rango de %@ a %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Rango de %@ a %@"; +"AX_GRAPH_STACK_PREFIX" = "Pila compuesta de"; "AX_GRAPH_AND_SEPARATOR" = " y "; "AX_GRAPH_POINT_%@" = "Punto: %@"; diff --git a/ResearchKit/Localized/es_MX.lproj/locversion.plist b/ResearchKit/Localized/es_MX.lproj/locversion.plist index 315bba72..f26c5e45 100644 --- a/ResearchKit/Localized/es_MX.lproj/locversion.plist +++ b/ResearchKit/Localized/es_MX.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale es_MX LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/fi.lproj/ResearchKit.strings b/ResearchKit/Localized/fi.lproj/ResearchKit.strings index d6805690..82c92524 100644 --- a/ResearchKit/Localized/fi.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/fi.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Vain numerot ovat sallittuja."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Pääsykoodin syötön edistymisen osoitin"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ merkkiä yhteensä %@ merkistä syötetty"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Unohditko pääsykoodin?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Avainnipun kohdetta ei voitu lisätä."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Ei"; "BOOL_YES" = "Kyllä"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Vastaa napauttamalla"; "NULL_ANSWER" = "Valitse vastaus"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Jatka tästä myöhemmin"; "BUTTON_OPTION_DISCARD" = "Hylkää tulokset"; "BUTTON_OPTION_STOP_TASK" = "Lopeta tehtävä"; +"BUTTON_SAVE" = "Tallenna"; +"BUTTON_CLEAR_ANSWER" = "Tyhjennä vastaus"; +"BUTTON_READ_ONLY_MODE" = "Tätä vastausta ei voida muuttaa."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Aktiviteetti alkaa"; "TASK_COMPLETE_TITLE" = "Aktiviteetti valmis"; "TASK_COMPLETE_TEXT" = "Datasi analysoidaan ja sinulle ilmoitetaan, kun tuloksesi ovat valmiina."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ sekuntia jäljellä."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Kaappaa kuva"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Kaapatuille kuville ei ole määritetty kohdehakemistoa."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Kaapattua kuvaa ei voitu tallentaa."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Aloita tallentaminen"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Lopeta tallentaminen"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Kaappaa video uudelleen"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kuntoilu"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Matka (%@)"; @@ -214,7 +229,7 @@ /* Short walk active task. */ "WALK_TASK_TITLE" = "Askeleet ja tasapaino"; -"WALK_INTRO_TEXT" = "Tämä aktiviteetti arvioi askellustasi ja tasapainoasi kävellessä tasaisesti ja seistessä. Älä jatka, jos et pysty turvallisesti kävelemään avustamatta."; +"WALK_INTRO_TEXT" = "Tämä aktiviteetti arvioi askellustasi ja tasapainoasi, kun kävelet tasaisesti ja seisot. Älä jatka, jos et pysty turvallisesti kävelemään avustamatta."; "WALK_INTRO_2_TEXT_%ld" = "Etsi paikka, jossa voit turvallisesti kävellä avustamatta noin %ld askelta suoraan."; "WALK_INTRO_2_DETAIL" = "Laita puhelin taskuun tai laukkuun ja seuraa ääniohjeita."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Seiso nyt paikoillaan %@."; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Käänny ympäri ja kävele takaisin alkupisteeseen."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Kävele enintään %ld askelta suoraan."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Etsi paikka, jossa voit turvallisesti kävellä suoraa reittiä edestakaisin. Yritä kävellä jatkuvasti kääntyen reitin päissä ikään kuin kiertäisit liikenteenohjainta.\n\nSeuraavaksi sinua pyydetään kääntymään ympäri täysi kierros, ja sitten seisomaan paikallasi kädet sivuilla ja jalat noin hartianleveyden etäisyydellä toisistaan."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Kun olet valmis, napauta Aloita.\nLaita sitten puhelin taskuun tai laukkuun ja seuraa ääniohjeita."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Kävele suoraa reittiä edestakaisin %@. Kävele, kuten kävelisit tavallisesti."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Käänny kokonaan ympäri ja seiso paikallasi %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Aktiviteetti on suoritettu."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Napautusnopeus"; +"TAPPING_TASK_TITLE_RIGHT" = "Oikea käsi"; +"TAPPING_TASK_TITLE_LEFT" = "Vasen käsi"; "TAPPING_INTRO_TEXT" = "Tämä aktiviteetti mittaa napautusnopeuttasi."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Aseta puhelin tasaiselle alustalle. Näytölle tulee näkyviin kaksi painiketta. Napauta painikkeita %@ vuorotellen saman käden kahdella sormella niin nopeasti kuin pystyt."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Laita puhelin tasaiselle alustalle."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Käytä saman käden kahta sormea näytön painikkeiden napauttamiseen vuorotellen."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Käytä oikean käden kahta sormea näytön painikkeiden napauttamiseen vuorotellen."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Käytä vasemman käden kahta sormea näytön painikkeiden napauttamiseen vuorotellen."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Suorita nyt sama testi oikealla kädellä."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Suorita nyt sama testi vasemmalla kädellä."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Napauta yhtä sormea ja sitten toista. Yritä ajoittaa napautukset mahdollisimman tasaisesti. Napauttele %@."; "TAPPING_CALL_TO_ACTION" = "Aloita napauttamalla Aloita-painiketta."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Aloita napauttamalla Seuraava."; "TAP_BUTTON_TITLE" = "Napauta"; "TOTAL_TAPS_LABEL" = "Napautuksia yhteensä"; -"TAPPING_INSTRUCTION" = "Napauta painikkeita niin nopeasti kuin pystyt kahdella sormella."; - +"TAPPING_INSTRUCTION" = "Napauta painikkeita niin tasaisesti kuin pystyt kahdella sormella."; +"TAPPING_INSTRUCTION_RIGHT" = "Napauta painikkeita OIKEALLA kädellä."; +"TAPPING_INSTRUCTION_LEFT" = "Napauta painikkeita VASEMMALLA kädellä."; +"TAPPING_SKIP_TITLE" = "Ohita tämä käsi"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Ääni"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Tämä aktiviteetti arvioi ääntäsi tallentamalla sitä puhelimen alareunassa olevalla mikrofonilla."; "AUDIO_TOO_LOUD_LABEL" = "Liian kovaa"; "AUDIO_GENERIC_ERROR_LABEL" = "Ei voida äänittää"; +"AUDIO_LEVEL_CHECK_LABEL" = "Odota, taustamelun tasoa tarkistetaan."; +"AUDIO_TOO_LOUD_MESSAGE" = "Ympäristön melutaso on liian korkea, jotta ääntäsi voitaisiin tallentaa. Siirry hiljaisempaan paikkaan ja yritä uudelleen."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Napauta Seuraava, kun olet valmis."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometria"; @@ -319,7 +354,7 @@ "PASAT_INTRO_TEXT" = "PASAT-testi (Paced Auditory Serial Addition Test) mittaa kuullun informaation käsittelynopeuttasi ja laskutaitoasi."; "PVSAT_INTRO_TEXT" = "PVSAT-testi (Paced Visual Serial Addition Test) mittaa nähdyn informaation käsittelynopeuttasi ja laskutaitoasi."; "PAVSAT_INTRO_TEXT" = "PAVSAT-testi (Paced Auditory and Visual Serial Addition Test) mittaa kuullun ja nähdyn informaation käsittelynopeuttasi ja laskutaitoasi."; -"PSAT_INTRO_TEXT_2_%@" = "Yksi numero näytetään %@ sekunnin välein.\nKukin uusi numero on lisättävä sitä edeltäneeseen.\nHuomaa, että ei ole tarkoitus laskea jatkuvaa summaa, vaan vain kahden viimeisen numeron summa."; +"PSAT_INTRO_TEXT_2_%@" = "Yksittäisiä numeroita näytetään %@ sekunnin välein.\nKukin uusi numero on lisättävä sitä edeltäneeseen.\nHuomaa, että ei ole tarkoitus laskea jatkuvaa summaa, vaan vain kahden viimeisen numeron summa."; "PSAT_CALL_TO_ACTION" = "Aloita napauttamalla Aloita-painiketta."; "PSAT_INITIAL_INSTRUCTION" = "Muista tämä ensimmäinen numero."; "PSAT_INSTRUCTION" = "Lisää tämä uusi numero edelliseen."; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Poimi palikka kahdella sormella."; "HOLE_PEG_TEST_TEXT_2" = "Pudota palikka nostamalla sormia."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Vapina-aktiviteetti"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Tämä aktiviteetti mittaa käsiesi vapinaa eri asennoissa. Etsi paikka, jossa voit istua mukavasti tämän aktiviteetin keston ajan."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Pidä puhelinta alla olevan kuvan mukaisesti kädessä, jossa vaikutus on voimakkaampi."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Pidä puhelinta alla olevan kuvan mukaisesti OIKEASSA kädessä."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Pidä puhelinta alla olevan kuvan mukaisesti VASEMMASSA kädessä."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Sinua pyydetään suorittamaan %@ puhelin kädessä istuen."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "tehtävä"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "kaksi tehtävää"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "kolme tehtävää"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "neljä tehtävää"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "viisi tehtävää"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Jatka napauttamalla Seuraava."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Valmistaudu pitämään puhelinta sylissäsi."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Valmistaudu pitämään puhelinta sylissäsi VASEMMALLA kädellä."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Valmistaudu pitämään puhelinta sylissäsi OIKEALLA kädellä."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Pidä puhelinta sylissäsi %ld sekuntia."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Pidä puhelinta nyt käsi suorana olkapään korkeudella."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Pidä puhelinta nyt VASEN käsi suorana olkapään korkeudella."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Pidä puhelinta nyt OIKEA käsi suorana olkapään korkeudella."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Pidä puhelinta käsi suorana %ld sekuntia."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Pidä puhelinta nyt olkapään korkeudella kyynärpää taivutettuna."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Pidä puhelinta nyt VASEMMALLA kädellä olkapään korkeudella kyynärpää taivutettuna."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Pidä puhelinta nyt OIKEALLA kädellä olkapään korkeudella kyynärpää taivutettuna."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Pidä puhelinta kyynärpää taivutettuna %ld sekuntia"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Kosketa nyt puhelimella nenääsi toistuvasti pitäen kyynärpäätä taivutettuna."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Kosketa nyt puhelimella nenääsi toistuvasti pitäen puhelinta VASEMMASSA kädessä ja kyynärpäätä taivutettuna."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Kosketa nyt puhelimella nenääsi toistuvasti pitäen puhelinta OIKEASSA kädessä ja kyynärpäätä taivutettuna."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Kosketa puhelimella nenääsi toistuvasti %ld sekuntia"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Valmistaudu vilkuttamaan kuninkaallisesti (vilkuttamaan rannetta pyörittämällä)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Valmistaudu puhelin VASEMMASSA kädessä vilkuttamaan kuninkaallisesti (vilkuttamaan rannetta pyörittämällä)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Valmistaudu puhelin OIKEASSA kädessä vilkuttamaan kuninkaallisesti (vilkuttamaan rannetta pyörittämällä)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Vilkuta kuninkaallisesti %ld sekuntia."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Vaihda puhelin nyt VASEMPAAN käteen ja jatka seuraavaan tehtävään."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Vaihda puhelin nyt OIKEAAN käteen ja jatka seuraavaan tehtävään."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Jatka seuraavaan tehtävään."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktiviteetti valmis."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Sinua pyydetään suorittamaan %@ istuen, ensin puhelin toisessa kädessä ja sitten toisessa."; +"TREMOR_SKIP_LEFT_HAND" = "En voi suorittaa tätä aktiviteettia VASEMMALLA kädellä."; +"TREMOR_SKIP_RIGHT_HAND" = "En voi suorittaa tätä aktiviteettia OIKEALLA kädellä."; +"TREMOR_SKIP_NEITHER" = "Voin suorittaa tämän aktiviteetin molemmilla käsillä."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Tiedostoa ei voitu luoda"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Ei voitu poistaa riittävästi lokitiedostoja raja-arvon saavuttamiseksi."; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Kaappauksen esikatselu"; "AX_IMAGE_CAPTURED_LABEL" = "Kaapattu kuva"; +"AX_VIDEO_CAPTURE_LABEL" = "Videokaappauksen esikatselu"; +"AX_VIDEO_CAPTURED_LABEL" = "Kaapattu video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Koon %@ levyä ei voida laittaa koon %@ levyn päälle"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Kohde"; "AX_TOWER_OF_HANOI_TOWER" = "Torni"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Sisältää levyjä, joiden koko on %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Tyhjä"; -"AX_GRAPH_RANGE_FORMAT" = "Alue välillä %@–%@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Alue välillä %@–%@"; +"AX_GRAPH_STACK_PREFIX" = "Pino, joka koostuu arvoista"; "AX_GRAPH_AND_SEPARATOR" = " ja "; "AX_GRAPH_POINT_%@" = "Piste: %@"; diff --git a/ResearchKit/Localized/fi.lproj/locversion.plist b/ResearchKit/Localized/fi.lproj/locversion.plist index a29c9425..573eed67 100644 --- a/ResearchKit/Localized/fi.lproj/locversion.plist +++ b/ResearchKit/Localized/fi.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale fi LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/fr.lproj/ResearchKit.strings b/ResearchKit/Localized/fr.lproj/ResearchKit.strings index dc8f8ba1..df6ff5a2 100644 --- a/ResearchKit/Localized/fr.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/fr.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Caractères numériques uniquement."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicateur de progression de la saisie du code"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ sur %@ chiffres saisis"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Code oublié ?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Impossible d’ajouter l’élément du trousseau."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Non"; "BOOL_YES" = "Oui"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "pi"; +"MEASURING_UNIT_IN" = "po"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Toucher pour répondre"; "NULL_ANSWER" = "Sélectionner une réponse"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Enregistrer pour plus tard"; "BUTTON_OPTION_DISCARD" = "Effacer les résultats"; "BUTTON_OPTION_STOP_TASK" = "Terminer la tâche"; +"BUTTON_SAVE" = "Enregistrer"; +"BUTTON_CLEAR_ANSWER" = "Effacer la réponse"; +"BUTTON_READ_ONLY_MODE" = "Cette réponse ne peut pas être modifiée."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Début de l’activité dans"; "TASK_COMPLETE_TITLE" = "Activité terminée"; -"TASK_COMPLETE_TEXT" = "Vos données vont être analysées. Vous serez averti lorsque les résultats sont prêts."; +"TASK_COMPLETE_TEXT" = "Vos données vont être analysées. Vous serez averti lorsque les résultats seront prêts."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ secondes restantes."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturer l’image"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Aucun répertoire de sortie n’a été spécifié pour les images capturées."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "L’image capturée n’a pas pu être enregistrée."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Lancer l’enregistrement"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Arrêter l’enregistrement"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapturer la vidéo"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distance (%@)"; @@ -214,7 +229,7 @@ /* Short walk active task. */ "WALK_TASK_TITLE" = "Marche et équilibre"; -"WALK_INTRO_TEXT" = "Cette activité mesure votre équilibre pendant que vous marchez et que vous vous tenez debout. Ne poursuivez pas si vous ne pouvez pas marcher en sécurité sans assistance."; +"WALK_INTRO_TEXT" = "Cette activité observe votre allure et votre équilibre pendant que vous marchez et que vous vous tenez debout. Ne continuez pas si vous ne pouvez pas marcher en sécurité sans assistance."; "WALK_INTRO_2_TEXT_%ld" = "Trouvez un endroit où vous pouvez effectuer environ %ld pas sur une ligne droite en sécurité et sans assistance."; "WALK_INTRO_2_DETAIL" = "Placez votre téléphone dans votre poche ou dans un sac et suivez les instructions audio."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Maintenant, ne bougez plus pendant %@."; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Faites demi-tour et revenez à votre point de départ."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Faites jusqu’à %ld pas sur une ligne droite."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Trouvez un endroit où vous pouvez faire des allers-retours en ligne droite en sécurité. Essayez de marcher de façon continue en effectuant des demi-tours au bout de chaque aller, comme si vous effectuiez un virage autour d’un cône.\n\nVous devrez ensuite effectuer un cercle complet puis vous tenir immobile, les bras le long du corps et les pieds écartés environ de la largeur des épaules."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Touchez Démarrer lorsque vous êtes prêt à commencer.\nPlacez votre téléphone dans votre poche ou dans un sac et suivez les instructions audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Faites des allers-retours en ligne droite pendant %@. Marchez normalement."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Effectuez un cercle complet en marchant, puis restez immobile pendant %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Vous avez terminé cette activité."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Vitesse de saisie"; +"TAPPING_TASK_TITLE_RIGHT" = "Main droite"; +"TAPPING_TASK_TITLE_LEFT" = "Main gauche"; "TAPPING_INTRO_TEXT" = "Cette activité mesure votre vitesse de saisie."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Posez votre téléphone sur une surface plane. Deux boutons s’afficheront sur votre écran pendant %@. Avec deux doigts de la même main, touchez les boutons le plus rapidement possible en alternant les doigts."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Placez votre téléphone sur une surface plane."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Avec deux doigts de la même main et en les alternant, touchez les boutons à l’écran."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Avec deux doigts de la main droite et en les alternant, touchez les boutons à l’écran."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Avec deux doigts de la main gauche et en les alternant, touchez les boutons à l’écran."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Répétez à présent ce test avec la main droite."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Répétez à présent ce test avec la main gauche."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Touchez l’écran avec un doigt, puis avec l’autre, pendant %@. Essayez de respecter le même intervalle de temps entre chaque toucher pour être aussi régulier que possible."; "TAPPING_CALL_TO_ACTION" = "Touchez Démarrer pour commencer."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Touchez Suivant pour commencer."; "TAP_BUTTON_TITLE" = "Toucher"; "TOTAL_TAPS_LABEL" = "Total de touchers"; -"TAPPING_INSTRUCTION" = "Touchez les boutons le plus rapidement possible avec deux doigts."; - +"TAPPING_INSTRUCTION" = "Touchez les boutons de façon aussi régulière que possible avec deux doigts."; +"TAPPING_INSTRUCTION_RIGHT" = "Touchez les boutons de la main DROITE."; +"TAPPING_INSTRUCTION_LEFT" = "Touchez les boutons de la main GAUCHE."; +"TAPPING_SKIP_TITLE" = "Ne pas faire avec cette main"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voix"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Cette activité évalue votre voix en l’enregistrant dans le micro au bas de votre téléphone."; "AUDIO_TOO_LOUD_LABEL" = "Trop fort"; "AUDIO_GENERIC_ERROR_LABEL" = "Enregistrement audio impossible"; +"AUDIO_LEVEL_CHECK_LABEL" = "Veuillez patienter pendant que nous étudions le volume du fond sonore."; +"AUDIO_TOO_LOUD_MESSAGE" = "Le volume ambiant est trop fort pour enregistrer votre voix. Rendez-vous dans un endroit plus calme et réessayez."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Touchez Suivant lorsque vous êtes prêt."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiométrie tonale"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Ramassez le rond avec deux doigts."; "HOLE_PEG_TEST_TEXT_2" = "Levez les doigts pour faire tomber le rond."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremblements"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Cette activité mesure les tremblements de vos mains dans différentes positions. Trouvez une position assise confortable, que vous garderez pendant toute la durée de ce test."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Tenez votre téléphone dans la main la plus affectée, comme indiqué dans l’image ci-dessous."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Tenez votre téléphone dans la main DROITE, comme indiqué dans l’image ci-dessous."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Tenez votre téléphone dans la main GAUCHE, comme indiqué dans l’image ci-dessous."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Vous serez invité à réaliser %@ en positon assise, le téléphone dans votre main."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "une tâche"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "deux tâches"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "trois tâches"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "quatre tâches"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinq tâches"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Touchez Suivant pour continuer."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Préparez-vous à tenir votre téléphone sur vos genoux."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Préparez-vous à tenir votre téléphone sur vos genoux avec votre main GAUCHE."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Préparez-vous à tenir votre téléphone sur vos genoux avec votre main DROITE."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Tenez votre téléphone sur vos genoux pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Maintenant, tenez votre téléphone à hauteur d’épaule, la main tendue."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Maintenant, tenez votre téléphone avec votre main GAUCHE, à hauteur d’épaule, la main tendue."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Maintenant, tenez votre téléphone avec votre main DROITE, à hauteur d’épaule, la main tendue."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Tenez votre téléphone, la main tendue, pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Maintenant, tenez votre téléphone à hauteur d’épaule, le coude plié."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Maintenant, tenez votre téléphone avec votre main GAUCHE, à hauteur d’épaule, le coude plié."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Maintenant, tenez votre téléphone avec votre main DROITE, à hauteur d’épaule, le coude plié."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Tenez votre téléphone, le coude plié, pendant %ld secondes"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Maintenant, avec le coude plié, portez votre téléphone à votre nez, plusieurs fois."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Maintenant, avec le coude plié et le téléphone dans votre main GAUCHE, portez votre téléphone à votre nez, plusieurs fois."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Maintenant, avec le coude plié et le téléphone dans votre main DROITE, portez votre téléphone à votre nez, plusieurs fois."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Portez votre téléphone à votre nez, plusieurs fois, pendant %ld secondes"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Préparez-vous à saluer de la main, les doigts serrés les uns contre les autres."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Préparez-vous à saluer de la main GAUCHE, le téléphone en main, les doigts serrés les uns contre les autres."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Préparez-vous à saluer de la main DROITE, le téléphone en main, les doigts serrés les uns contre les autres."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Saluez de la main, les doigts serrés les uns contre les autres, pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Placez maintenant le téléphone dans votre main GAUCHE et passez à la tâche suivante."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Placez maintenant le téléphone dans votre main DROITE et passez à la tâche suivante."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Passez à la tâche suivante."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activité terminée."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Vous serez invité à réaliser %@ en positon assise, le téléphone dans une main, puis dans l’autre."; +"TREMOR_SKIP_LEFT_HAND" = "Je ne peux pas effectuer cette activité avec ma main GAUCHE."; +"TREMOR_SKIP_RIGHT_HAND" = "Je ne peux pas effectuer cette activité avec ma main DROITE."; +"TREMOR_SKIP_NEITHER" = "Je peux effectuer cette activité des deux mains."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Création du fichier impossible"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Impossible de supprimer assez de fichiers journaux pour atteindre le seuil"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Aperçu de la capture"; "AX_IMAGE_CAPTURED_LABEL" = "Image capturée"; +"AX_VIDEO_CAPTURE_LABEL" = "Aperçu de la capture vidéo"; +"AX_VIDEO_CAPTURED_LABEL" = "Vidéo capturée"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Impossible de placer un disque de taille %@ sur un disque de taille %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Cible"; "AX_TOWER_OF_HANOI_TOWER" = "Tour"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Possède un disque de tailles %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Vide"; -"AX_GRAPH_RANGE_FORMAT" = "De %@ à %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "De %@ à %@"; +"AX_GRAPH_STACK_PREFIX" = "Pile composée de"; "AX_GRAPH_AND_SEPARATOR" = " et "; "AX_GRAPH_POINT_%@" = "Point : %@"; diff --git a/ResearchKit/Localized/fr.lproj/locversion.plist b/ResearchKit/Localized/fr.lproj/locversion.plist index a549ea42..3abe53cf 100644 --- a/ResearchKit/Localized/fr.lproj/locversion.plist +++ b/ResearchKit/Localized/fr.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale fr LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/fr_CA.lproj/ResearchKit.strings b/ResearchKit/Localized/fr_CA.lproj/ResearchKit.strings index e20455a7..78c105b1 100644 --- a/ResearchKit/Localized/fr_CA.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/fr_CA.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Seuls les caractères numériques sont autorisés."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicateur de progression de saisie du code"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ sur %@ chiffres entrés"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Code oublié?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Impossible d’ajouter l’élément du trousseau."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Non"; "BOOL_YES" = "Oui"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "pi"; +"MEASURING_UNIT_IN" = "po"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Toucher pour répondre"; "NULL_ANSWER" = "Sélectionner une réponse"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Enregistrer pour plus tard"; "BUTTON_OPTION_DISCARD" = "Supprimer les résultats"; "BUTTON_OPTION_STOP_TASK" = "Terminer la tâche"; +"BUTTON_SAVE" = "Enregistrer"; +"BUTTON_CLEAR_ANSWER" = "Effacer la réponse"; +"BUTTON_READ_ONLY_MODE" = "Impossible de modifier cette réponse."; /* General active tasks. */ "COUNTDOWN_LABEL" = "L’activité commence dans"; "TASK_COMPLETE_TITLE" = "Activité terminée"; "TASK_COMPLETE_TEXT" = "Les données vont être analysées, et vous recevrez une notification lorsque les résultats seront disponibles."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ secondes restantes."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturer l’image"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Aucun répertoire de sortie n’a été spécifié pour les images capturées."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "L’image capturée n’a pas pu être enregistrée."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Lancer l’enregistrement"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Arrêter l’enregistrement"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapturer la vidéo"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Forme"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distance (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Retournez-vous, puis marchez vers votre point de départ."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Parcourez %ld pas en ligne droite."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Identifiez un endroit où vous pouvez faire des allers-retours en ligne droite de façon sécuritaire. Essayez de marcher sans vous arrêter, en faisant demi-tour en fin de ligne droite, comme si vous contourniez un cône.\n\nIl vous sera ensuite demandé de vous retourner en effectuant un cercle complet, puis de rester immobile, les bras le long du corps et les pieds dans l’alignement des épaules."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Touchez Démarrer lorsque vous êtes prêt.\nPlacez ensuite votre téléphone dans une poche ou un sac, puis suivez les instructions audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Faites des allers-retours en ligne droite pendant %@. Marchez de façon habituelle."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Effectuez un cercle complet, puis restez immobile pendant %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Vous avez terminé l’activité."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Vitesse de frappe"; +"TAPPING_TASK_TITLE_RIGHT" = "Main droite"; +"TAPPING_TASK_TITLE_LEFT" = "Main gauche"; "TAPPING_INTRO_TEXT" = "Cette activité mesure votre vitesse de frappe."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Placez votre iPhone sur une surface plane. Deux boutons s’afficheront à l’écran pendant %@. Touchez les boutons tour à tour avec deux doigts d’une même main, aussi vite que possible."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Placez votre téléphone sur une surface plane."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Utilisez deux doigts d’une même main pour toucher tour à tour les boutons affichés à l’écran."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Utilisez deux doigts de la main droite pour toucher tour à tour les boutons affichés à l’écran."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Utilisez deux doigts de la main gauche pour toucher tour à tour les boutons affichés à l’écran."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Maintenant, répétez le test avec la main droite."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Maintenant, répétez le test avec la main gauche."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Touchez l’écran avec un doigt, puis avec l’autre. Faites en sorte que les contacts soient aussi réguliers que possible. Continuez pendant %@."; "TAPPING_CALL_TO_ACTION" = "Touchez Démarrer pour commencer."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Touchez Suivant pour commencer."; "TAP_BUTTON_TITLE" = "Toucher"; "TOTAL_TAPS_LABEL" = "Total de contacts"; -"TAPPING_INSTRUCTION" = "Touchez les boutons aussi vite que possible avec deux doigts."; - +"TAPPING_INSTRUCTION" = "Touchez les boutons aussi régulièrement que possible avec deux doigts."; +"TAPPING_INSTRUCTION_RIGHT" = "Touchez les boutons avec la main DROITE."; +"TAPPING_INSTRUCTION_LEFT" = "Touchez les boutons avec la main GAUCHE."; +"TAPPING_SKIP_TITLE" = "Ignorer cette main"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voix"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Cette activité évalue votre voix en l’enregistrant grâce au micro situé au bas de votre téléphone."; "AUDIO_TOO_LOUD_LABEL" = "Trop fort"; "AUDIO_GENERIC_ERROR_LABEL" = "Impossible d’enregistrer le son"; +"AUDIO_LEVEL_CHECK_LABEL" = "Veuillez patienter pendant que nous vérifions le niveau de bruit de fond."; +"AUDIO_TOO_LOUD_MESSAGE" = "Le niveau de bruit ambiant est trop élevé pour enregistrer votre voix. Choisissez un endroit plus silencieux, puis réessayez."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Touchez Suivant lorsque vous êtes prêt."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiométrie tonale"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Saisissez le cercle avec deux doigts."; "HOLE_PEG_TEST_TEXT_2" = "Levez vos doigts pour relâcher le cercle."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremblements"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Cette activité mesure les tremblements de vos mains dans plusieurs positions. Choisissez un endroit où vous pouvez vous assoir confortablement pendant la durée de cette activité."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Tenez le téléphone dans la main la plus affectée comme indiqué dans l’image ci-dessous."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Tenez le téléphone dans la main DROITE comme indiqué dans l’image ci-dessous."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Tenez le téléphone dans la main GAUCHE comme indiqué dans l’image ci-dessous."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Il vous sera demandé d’effectuer %@ tout en étant assis avec le téléphone dans la main."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "une tâche"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "deux tâches"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "trois tâches"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "quatre tâches"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinq tâches"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Touchez Suivant pour continuer."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Préparez-vous à tenir votre téléphone sur les genoux."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Préparez-vous à tenir votre téléphone sur les genoux avec votre main GAUCHE."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Préparez-vous à tenir votre téléphone sur les genoux avec votre main DROITE."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Tenez votre téléphone sur les genoux pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Maintenant, tenez votre téléphone en tendant votre bras à la hauteur de votre épaule."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Maintenant, tenez votre téléphone dans la main GAUCHE en tendant votre bras à la hauteur de votre épaule."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Maintenant, tenez votre téléphone dans la main DROITE en tendant votre bras à la hauteur de votre épaule."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Tenez votre téléphone avec la main tendue pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Maintenant, tenez votre téléphone à la hauteur de votre épaule tout en pliant le coude."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Maintenant, tenez votre téléphone dans la main GAUCHE à la hauteur de votre épaule tout en pliant le coude."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Maintenant, tenez votre téléphone dans la main DROITE à la hauteur de votre épaule tout en pliant le coude."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Tenez votre téléphone tout en pliant le coude pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Maintenant, pliez le coude et touchez votre nez avec le téléphone de façon répétée."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Maintenant, pliez le coude tout en tenant votre téléphone dans la main GAUCHE et touchez votre nez avec le téléphone de façon répétée."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Maintenant, pliez le coude tout en tenant votre téléphone dans la main DROITE et touchez votre nez avec le téléphone de façon répétée."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Touchez votre nez avec le téléphone à plusieurs reprises pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Préparez-vous à saluer en faisant pivoter le poignet."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Préparez-vous à saluer de la main GAUCHE en tenant le téléphone."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Préparez-vous à saluer de la main DROITE en tenant le téléphone."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Saluez de la main pendant %ld secondes."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Prenez le téléphone dans la main GAUCHE, puis passez à la tâche suivante."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Prenez le téléphone dans la main DROITE, puis passez à la tâche suivante."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Passez à la tâche suivante."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activité terminée."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Il vous sera demandé d’effectuer %@ tout en étant assis avec le téléphone dans une main, puis dans l’autre."; +"TREMOR_SKIP_LEFT_HAND" = "Je ne peux pas effectuer cette activité avec la main GAUCHE."; +"TREMOR_SKIP_RIGHT_HAND" = "Je ne peux pas effectuer cette activité avec la main DROITE."; +"TREMOR_SKIP_NEITHER" = "Je peux effectuer cette activité avec les deux mains."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Impossible de créer le fichier"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Impossible de supprimer suffisamment de fichiers d’historique pour atteindre le seuil"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Aperçu de l’image capturée"; "AX_IMAGE_CAPTURED_LABEL" = "Image capturée"; +"AX_VIDEO_CAPTURE_LABEL" = "Aperçu de la vidéo capturée"; +"AX_VIDEO_CAPTURED_LABEL" = "Vidéo capturée"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Impossible de placer un disque de taille %@ sur un disque de taille %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Cible"; "AX_TOWER_OF_HANOI_TOWER" = "Tour"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Comporte des disques de tailles %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Vide"; -"AX_GRAPH_RANGE_FORMAT" = "De %@ à %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "De %@ à %@"; +"AX_GRAPH_STACK_PREFIX" = "Pile composée de"; "AX_GRAPH_AND_SEPARATOR" = " et "; "AX_GRAPH_POINT_%@" = "Point : %@"; diff --git a/ResearchKit/Localized/fr_CA.lproj/locversion.plist b/ResearchKit/Localized/fr_CA.lproj/locversion.plist index c5dd3530..2ee65970 100644 --- a/ResearchKit/Localized/fr_CA.lproj/locversion.plist +++ b/ResearchKit/Localized/fr_CA.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale fr_CA LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/he.lproj/ResearchKit.strings b/ResearchKit/Localized/he.lproj/ResearchKit.strings index efb60e69..7e81bf05 100644 --- a/ResearchKit/Localized/he.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/he.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "ניתן להשתמש בתווי ספרות בלבד."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "מד התקדמות של הקשת קוד גישה"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "הוקשו %@ מתוך %@ ספרות"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "שכחת את קוד הגישה?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "לא ניתן היה להוסיף את פריט צרור המפתחות."; @@ -167,6 +168,11 @@ "BOOL_NO" = "לא"; "BOOL_YES" = "כן"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "ס״מ"; +"MEASURING_UNIT_FT" = "רגל"; +"MEASURING_UNIT_IN" = "אינץ׳"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "הקש/י בכדי לענות"; "NULL_ANSWER" = "בחר/י תשובה"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "שמור למועד מאוחר יותר"; "BUTTON_OPTION_DISCARD" = "מחק את התוצאות"; "BUTTON_OPTION_STOP_TASK" = "סיים את המשימה"; +"BUTTON_SAVE" = "שמור"; +"BUTTON_CLEAR_ANSWER" = "נקה את התשובה"; +"BUTTON_READ_ONLY_MODE" = "לא ניתן לשנות את התשובה הזאת."; /* General active tasks. */ "COUNTDOWN_LABEL" = "מתחיל פעילות בעוד"; "TASK_COMPLETE_TITLE" = "הפעילות הושלמה"; "TASK_COMPLETE_TEXT" = "הנתונים שלך ינותחו וכאשר התוצאות יהיו מוכנות תקבל/י הודעה."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "נותרו %@ שניות."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "צלם תמונה"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "לא צוינה ספריית פלט עבור התמונות שצולמו."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "לא ניתן היה לשמור את התמונה שצולמה."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "התחל הקלטה"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "הפסק הקלטה"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "צלם/י את הסרט מחדש"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "כושר"; "FITNESS_DISTANCE_TITLE_FORMAT" = "מרחק (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "הסתובב/י והתהלך/י חזרה למקום שבו התחלת."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "לך/י %ld צעדים לכל היותר בקו ישר."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "מצא/י מקום שבו ניתן ללכת בקו ישר הלוך וחזור בבטחה. נסה/י לצעוד באופן רציף ולבצע פניות בקצוות המסלול, כאילו תוך הקפת קונוס דמיוני המסמן את הקצה.\n\nלאחר מכן, תתבקש/י ללכת במסלול מעגלי שלם ואז לעצור ולעמוד כשהידיים לצידי הגוף והרגליים בפיסוק קל ברוחב הכתפיים."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "הקש/י על ״התחל״ כשתהיה/י מוכן/ה.\nלאחר מכן הנח/י את הטלפון בכיס או בתיק ובצע/י את ההוראות שיושמעו לך."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "לך/י הלוך ושוב בקו ישר במשך %@, באופן ההליכה הרגיל שלך."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "בצע/י סיבוב שלם ולאחר מכן עמוד/י למשך %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "השלמת את הפעילות."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "מהירות הקשה"; +"TAPPING_TASK_TITLE_RIGHT" = "יד ימין"; +"TAPPING_TASK_TITLE_LEFT" = "יד שמאל"; "TAPPING_INTRO_TEXT" = "פעילות זו מודדת את מהירות ההקשה שלך."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "הנח/י את הטלפון על משטח שטוח. שני כפתורים יופיעו במסך למשך %@. כעת, השתמש/י בשתי אצבעות מאותה יד בכדי להקיש לחלופין על הכפתורים שמופיעים במהירות המרבית שתוכל/י."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "הנח/י את הטלפון על משטח ישר."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "הקש/י על הכפתורים שמופיעים על המסך עם שתי אצבעות של אותה היד המתחלפות ביניהן לסירוגין."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "הקש/י על הכפתורים שמופיעים על המסך בשתי אצבעות יד ימין המתחלפות ביניהן לסירוגין."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "הקש/י על הכפתורים שמופיעים על המסך בשתי אצבעות יד שמאל המתחלפות ביניהן לסירוגין."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "כעת חזור/י על אותה פעולה ביד ימין."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "כעת חזור/י על אותה פעולה ביד שמאל."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "הקש/י באצבע אחת, ולאחר מכן בשניה. נסה/י להקיש בקצב קבוע ככל שתוכל/י. המשך/י להקיש למשך %@."; "TAPPING_CALL_TO_ACTION" = "הקש/י על ״התחל״ בכדי להתחיל."; +"TAPPING_CALL_TO_ACTION_NEXT" = "הקש/י על ״הבא״ בכדי להתחיל."; "TAP_BUTTON_TITLE" = "הקש/י"; "TOTAL_TAPS_LABEL" = "סה״כ הקשות"; -"TAPPING_INSTRUCTION" = "הקש/י על הכפתורים במהירות הכי גבוהה שתוכל/י בשתי אצבעות."; - +"TAPPING_INSTRUCTION" = "הקש/י על הכפתורים בשתי אצבעות באופן עקבי ככל שניתן."; +"TAPPING_INSTRUCTION_RIGHT" = "הקש/י על הכפתורים ביד ימין."; +"TAPPING_INSTRUCTION_LEFT" = "הקש/י על הכפתורים ביד שמאל."; +"TAPPING_SKIP_TITLE" = "דלג/י על יד זו"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "קול"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "פעילות זו מעריכה את קולך על-ידי הקלטתו דרך המיקרופון שבתחתית הטלפון."; "AUDIO_TOO_LOUD_LABEL" = "חזק מדי"; "AUDIO_GENERIC_ERROR_LABEL" = "לא ניתן להקליט שמע"; +"AUDIO_LEVEL_CHECK_LABEL" = "המתן/י עד לסיום מדידת רעשי הרקע."; +"AUDIO_TOO_LOUD_MESSAGE" = "רעש הרקע חזק מדי ולא ניתן להקליט את קולך. עבור/י למקום שקט יותר ונסה/י שוב."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "כשתהיה/י מוכן, הקש/י על ״הבא״."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "מדידת היכולת לשמוע צלילים"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "הרם/י את הדיסקית בשתי אצבעות."; "HOLE_PEG_TEST_TEXT_2" = "הרם/י את אצבעותיך כדי להפיל את הדיסקית."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "פעילות למדידת הרעד"; +"TREMOR_TEST_INTRO_1_DETAIL" = "פעילות זו מודדת את הרעד בידיים שלך בתנוחות שונות. מצא/י מקום שבו תוכל/י לשבת בנוחות במשך כל הפעילות."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "החזק/י את הטלפון ביד שבה הבעיה מורגשת יותר, כמתואר בתמונה למטה."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "החזק/י את הטלפון ביד ימין, כמתואר בתמונה למטה."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "החזק/י את הטלפון ביד שמאל, כמתואר בתמונה למטה."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "בהמשך תתבקש/י לבצע %@ בישיבה עם הטלפון ביד."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "משימה אחת"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "שתי משימות"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "שלוש משימות"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "ארבע משימות"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "חמש משימות"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "הקש/י על ״הבא״ בכדי להמשיך."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "התכונן/י להחזיק את הטלפון על הירכיים."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "התכונן/י להחזיק את הטלפון ביד שמאל כשזאת מונחת על הירכיים."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "התכונן/י להחזיק את הטלפון ביד ימין כשזאת מונחת על הירכיים."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "המשך/י להחזיק את הטלפון על הירכיים למשך %ld שניות."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "כעת החזק/י את הטלפון בגובה הכתפיים תוך יישור המרפק."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "כעת החזק/י את הטלפון ביד שמאל בגובה הכתפיים תוך יישור המרפק."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "כעת החזק/י את הטלפון ביד ימין בגובה הכתפיים תוך יישור המרפק."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "המשך/י להחזיק את הטלפון תוך יישור המרפק למשך %ld שניות."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "כעת החזק/י את הטלפון בגובה הכתפיים תוך כיפוף המרפק."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "כעת החזק/י את הטלפון ביד שמאל בגובה הכתפיים תוך כיפוף המרפק."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "כעת החזק/י את הטלפון ביד ימין בגובה הכתפיים תוך כיפוף המרפק."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "המשך/י להחזיק את הטלפון תוך כיפוף המרפק למשך %ld שניות"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "כעת, תוך שמירה על מרפק מכופף, גע/י עם הטלפון באף מספר פעמים ברצף."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "כעת, עם הטלפון ביד שמאל ותוך שמירה על מרפק מכופף, גע/י עם הטלפון באף מספר פעמים ברצף."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "כעת, עם הטלפון ביד ימין ותוך שמירה על מרפק מכופף, גע/י עם הטלפון באף מספר פעמים ברצף."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "המשך/י לגעת עם הטלפון באף למשך %ld שניות"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "התכונן/י לבצע ״נפנוף מלכותי״ (סיבוב מפרק כף היד על צירו)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "התכונן/י לביצוע ״נפנוף מלכותי״ תוך אחיזת הטלפון ביד שמאל (סיבוב מפרק כף היד על צירו)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "התכונן/י לביצוע ״נפנוף מלכותי״ תוך אחיזת הטלפון ביד ימין (סיבוב מפרק כף היד על צירו)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "המשך/י לבצע ״נפנוף מלכותי״ למשך %ld שניות."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "כעת העבר/י את הטלפון ליד שמאל והמשך/י למשימה הבאה."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "כעת העבר/י את הטלפון ליד ימין והמשך/י למשימה הבאה."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "המשך/י אל המשימה הבאה."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "הפעילות הושלמה."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "בהמשך תתבקש/י לבצע %@ בישיבה כשהטלפון נמצא תחילה ביד אחת, ולאחר מכן ביד השניה."; +"TREMOR_SKIP_LEFT_HAND" = "אני לא יכול/ה לבצע את הפעולה הזו ביד שמאל."; +"TREMOR_SKIP_RIGHT_HAND" = "אני לא יכול/ה לבצע את הפעולה הזו ביד ימין."; +"TREMOR_SKIP_NEITHER" = "אני יכול/ה לבצע את הפעולה הזו בשתי הידיים."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "לא ניתן ליצור את הקובץ"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "לא ניתן היה להסיר מספיק קובצי רישום בכדי להגיע לסף"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "צלם תצוגה מקדימה"; "AX_IMAGE_CAPTURED_LABEL" = "התמונה צולמה"; +"AX_VIDEO_CAPTURE_LABEL" = "תצוגה מקדימה של הסרט שצולם"; +"AX_VIDEO_CAPTURED_LABEL" = "הסרט שצולם"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "לא ניתן למקם דיסקית בגודל %@ על-גבי דיסקית בגודל %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "יעד"; "AX_TOWER_OF_HANOI_TOWER" = "מגדל"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "כולל דיסק בגדלים %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "ריק"; -"AX_GRAPH_RANGE_FORMAT" = "נע בין %@ ל-%@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "נע בין %@ ל-%@"; +"AX_GRAPH_STACK_PREFIX" = "הערימה מכילה"; "AX_GRAPH_AND_SEPARATOR" = " וגם"; "AX_GRAPH_POINT_%@" = "נקודה: %@"; diff --git a/ResearchKit/Localized/he.lproj/locversion.plist b/ResearchKit/Localized/he.lproj/locversion.plist index 3870aed5..3f197e68 100644 --- a/ResearchKit/Localized/he.lproj/locversion.plist +++ b/ResearchKit/Localized/he.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale he LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/hi.lproj/ResearchKit.strings b/ResearchKit/Localized/hi.lproj/ResearchKit.strings index 64b4c1e0..5a6f81eb 100644 --- a/ResearchKit/Localized/hi.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/hi.lproj/ResearchKit.strings @@ -37,7 +37,7 @@ "CONSENT_REVIEW_INSTRUCTION" = "नीचे दिए गए फ़ॉर्म को देखें और जारी रखने के लिए “सहमत” पर टैप करें।"; "CONSENT_REVIEW_ALERT_TITLE" = "समीक्षा"; "CONSENT_SIGNATURE_TITLE" = "हस्ताक्षर"; -"CONSENT_SIGNATURE_INSTRUCTION" = "कृपया अपनी ऊँगली का उपयोग करके नीचे दी गई रेखा पर हस्ताक्षर करें।"; +"CONSENT_SIGNATURE_INSTRUCTION" = "कृपया अपनी उँगली का उपयोग करके नीचे दी गई रेखा पर हस्ताक्षर करें।"; "CONSENT_SIGNATURE_PLACEHOLDER" = "यहाँ हस्ताक्षर करें"; "CONSENT_PAGE_NUMBER_FORMAT" = "पृष्ठ %1$ld/%2$ld"; @@ -119,7 +119,7 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "सत्यापन"; "VERIFICATION_STEP_TITLE" = "अपना ईमेल सत्यापित करें"; -"RESEND_EMAIL_LABEL_MESSAGE" = "यदि आपको सत्यापन ईमेल प्राप्त नहीं होता है और आप इसे पुनः प्राप्त करना चाहते हैं तो नीचे दिये गए लिंक पर टैप करें।"; +"RESEND_EMAIL_LABEL_MESSAGE" = "यदि आपको सत्यापन ईमेल प्राप्त नहीं हुआ है और आप चाहते हैं कि उसे पुनः प्रेषित किया जाए, तो नीचे दिए गए लिंक पर टैप करें।"; "RESEND_EMAIL_BUTTON_TITLE" = "सत्यापन ईमेल फिर से भेजें"; /* Login step */ @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "केवल न्यूमैरिक वर्णों की अनुमति है।"; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "पासकोड दर्ज करने की प्रक्रिया का संकेतक"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%1$@/%2$@ मान दर्ज किए गए"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "पासकोड भूल गए?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "कीचेन आइटम को जोड़ा नहीं जा सका।"; @@ -167,6 +168,11 @@ "BOOL_NO" = "नहीं"; "BOOL_YES" = "हाँ"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "सें॰मी॰"; +"MEASURING_UNIT_FT" = "फ़ीट"; +"MEASURING_UNIT_IN" = "इंच"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "उत्तर देने के लिए टैप करें"; "NULL_ANSWER" = "उत्तर का चयन करें"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "बाद के लिए सहेजें"; "BUTTON_OPTION_DISCARD" = "परिणाम ख़ारिज करें"; "BUTTON_OPTION_STOP_TASK" = "कार्य समाप्त करें"; +"BUTTON_SAVE" = "सहेजें"; +"BUTTON_CLEAR_ANSWER" = "उत्तर साफ़ करें"; +"BUTTON_READ_ONLY_MODE" = "इस उत्तर को संशोधित नहीं किया जा सकता है।"; /* General active tasks. */ "COUNTDOWN_LABEL" = "गतिविधि शुरू होने में शेष समय"; "TASK_COMPLETE_TITLE" = "गतिविधि पूर्ण"; "TASK_COMPLETE_TEXT" = "आपके डेटा का विश्लेषण किया जाएगा और परिणाम के तैयार होते ही आपको सूचित किया जाएगा।"; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ सेकंड शेष।"; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "छवि कैप्चर करें"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "कैप्चर की गई छवियों के लिए कोई आउटपुट निर्देशिका निर्दिष्ट नहीं की गई थी।"; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "कैप्चर की गई छवि सहेजी नहीं जा सकी।"; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "रिकॉर्डिंग शुरू करें"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "रिकॉर्डिंग रोकें"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "वीडियो पुनः कैप्चर करें"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "तंदुरुस्ती"; "FITNESS_DISTANCE_TITLE_FORMAT" = "दूरी (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "पीछे मुड़ें और जहाँ से आपने शुरूआत की थी, वहाँ वापस चलकर जाएँ।"; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "लगभग %ld कदम सीधे चलें।"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "ऐसी जगह ढूँढें, जहाँ आप एक ओर व दूसरी ओर सुरक्षित रूप से सीधे चल सकें। मार्ग की समाप्ति पर मुड़ें और लगातार चलते रहने का प्रयास करें, जैसे कि आप किसी शंकु के इर्द-गिर्द चल रहे हों।\n\nइसके बाद आपको पूर्ण वृत्त में मुड़ने के लिए, फिर अपनी भुजाओं को फैलाकर और अपने पैरों को लगभग कंधे की चौड़ाई तक फैलाकर स्थिर खड़े रहने के लिए कहा जाएगा।"; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "जब आप शुरू करने के लिए तैयार हों, “आरंभ करें” पर टैप करें।\nफिर अपने फ़ोन को जेब या बैग में रखें और ऑडियो निर्देशों का पालन करें।"; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "%@ तक पीछे और आगे सीधे चलें। अपनी सामान्य चाल से चलें।"; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "पूर्ण वृत्त में मुड़ें फिर %@ तक स्थिर खड़े रहें।"; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "आपने गतिविधि को पूर्ण कर लिया है।"; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "टैप करने की गति"; +"TAPPING_TASK_TITLE_RIGHT" = "दायॉं हाथ"; +"TAPPING_TASK_TITLE_LEFT" = "बायाँ हाथ"; "TAPPING_INTRO_TEXT" = "इस गतिविधि द्वारा आपकी टैप करने की गति का मापन किया जाता है।"; -"TAPPING_INTRO_TEXT_2_FORMAT" = "अपने फ़ोन को किसी समतल सतह पर रखें। %@ के लिए आपकी स्क्रीन पर दो बटन दिखाई देंगे। एक ही हाथ की दो ऊँगलियों से दोनों बटनों को जितना संभव हो सके उतनी तेज़ी से एक के बाद एक दबाएँ।"; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "अपना फ़ोन समतल सतह पर रखें।"; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "स्क्रीन पर बटनों पर एक के बाद एक टैप करने के लिए एक ही हाथ की दो उँगलियों का उपयोग करें।"; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "स्क्रीन पर बटनों पर एक के बाद एक टैप करने के लिए दाएँ हाथ की दो उँगलियों का उपयोग करें।"; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "स्क्रीन पर बटनों पर एक के बाद एक टैप करने के लिए बाएँ हाथ की दो उँगलियों का उपयोग करें।"; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "अब अपने दाएँ हाथ का उपयोग करके यही परीक्षण दोहराएँ।"; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "अब अपने बाएँ हाथ का उपयोग करके यही परीक्षण दोहराएँ।"; +"TAPPING_INTRO_TEXT_2_FORMAT" = "एक उँगली से फिर दूसरी उँगली से टैप करें। अपने टैप का समय जितना संभव हो, एक समान रखने का प्रयास करें। %@ तक टैप करते रहें।"; "TAPPING_CALL_TO_ACTION" = "आरंभ करने के लिए “आरंभ करें” पर टैप करें।"; +"TAPPING_CALL_TO_ACTION_NEXT" = "आरंभ करने के लिए “अगला” पर टैप करें।"; "TAP_BUTTON_TITLE" = "टैप करें"; "TOTAL_TAPS_LABEL" = "कुल टैप"; -"TAPPING_INSTRUCTION" = "दो ऊँगलियों से बटनों को जितना संभव हो सके उतनी तेज़ी से एक के बाद एक दबाएँ।"; - +"TAPPING_INSTRUCTION" = "बटनों को दो उँगलियों से जितना हो सके, उतने समान समयांतराल पर टैप करें।"; +"TAPPING_INSTRUCTION_RIGHT" = "अपने दाएँ हाथ से बटनों पर टैप करें।"; +"TAPPING_INSTRUCTION_LEFT" = "अपने बाएँ हाथ से बटनों पर टैप करें।"; +"TAPPING_SKIP_TITLE" = "इस हाथ को स्किप करें"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "वॉइस"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "इस गतिविधि द्वारा आपके फ़ोन के नीचे लगे माइक्रोफ़ोन से आपकी आवाज़ को रिकॉर्ड करके उसका मूल्यांकन किया जाता है।"; "AUDIO_TOO_LOUD_LABEL" = "बहुत तेज़"; "AUDIO_GENERIC_ERROR_LABEL" = "ऑडियो रिकॉर्ड करने में असमर्थ"; +"AUDIO_LEVEL_CHECK_LABEL" = "पृष्ठभूमि नॉइज़ स्तर की जाँच होने तक कृपया प्रतीक्षा करें।"; +"AUDIO_TOO_LOUD_MESSAGE" = "आस-पास नॉइज़ का स्तर बहुत अधिक होने के कारण आपकी आवाज़ रिकॉर्ड नहीं की जा सकती। कृपया किसी शांत जगह पर जाएँ और पुनः प्रयास करें।"; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "तैयार होने पर “अगला” पर टैप करें।"; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "टोन ऑडियोमेट्री"; @@ -336,8 +371,50 @@ "HOLE_PEG_TEST_PLACE_INSTRUCTION_RIGHT_HAND" = "अपने दाएँ हाथ से पेग को छिद्र में डालें।"; "HOLE_PEG_TEST_REMOVE_INSTRUCTION_LEFT_HAND" = "अपने बाएँ हाथ से पेग को रेखा के पीछे करें।"; "HOLE_PEG_TEST_REMOVE_INSTRUCTION_RIGHT_HAND" = "अपने दाएँ हाथ से पेग को रेखा के पीछे करें।"; -"HOLE_PEG_TEST_TEXT" = "दो ऊँगलियों से पेग को उठाएँ।"; -"HOLE_PEG_TEST_TEXT_2" = "पेग को डालने के लिए ऊँगलियों को उठाएँ।"; +"HOLE_PEG_TEST_TEXT" = "दो उँगलियों से पेग को उठाएँ।"; +"HOLE_PEG_TEST_TEXT_2" = "पेग को डालने के लिए उँगलियों को उठाएँ।"; + +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "कंपन गतिविधि"; +"TREMOR_TEST_INTRO_1_DETAIL" = "इस गतिविधि से विभिन्न स्थितियों में आपके हाथों के कंपन को मापा जाता है। ऐसी जगह ढूँढें जहाँ आप इस गतिविधि की अवधि के दौरान आराम से बैठ सकें।"; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "नीचे दी गई छवि में दिखाए अनुसार फ़ोन को अपने अधिक प्रभावित हाथ में पकड़ें।"; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "नीचे दी गई छवि में दिखाए अनुसार फ़ोन को अपने दाएँ हाथ में पकड़ें।"; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "नीचे दी गई छवि में दिखाए अनुसार फ़ोन को अपने बाएँ हाथ में पकड़ें।"; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "बैठे रहकर फ़ोन को अपने हाथ में पकड़कर आपसे %@ करने के लिए कहा जाएगा।"; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "कार्य"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "दो कार्य"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "तीन कार्य"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "चार कार्य"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "पाँच कार्य"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "अागे बढ़ने के लिए “अगला” पर टैप करें।"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "अपने फ़ोन को अपनी गोद में पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "बाएँ हाथ से अपने फ़ोन को अपनी गोद में पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "दाएँ हाथ से अपने फ़ोन को अपनी गोद में पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "अपने फ़ोन को अपनी गोद में %ld सेकंड तक पकड़े रखें।"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "अब अपने हाथ को कंधे की ऊँचाई तक फैलाकर अपने फ़ोन को पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "अब अपने बाएँ हाथ को कंधे की ऊँचाई तक फैलाकर अपने फ़ोन को पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "अब अपने दाएँ हाथ को कंधे की ऊँचाई तक फैलाकर अपने फ़ोन को पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "हाथ फैलाकर अपने फ़ोन को %ld सेकंड तक पकड़े रखें।"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "अब अपनी कोहनी मोड़कर अपने फ़ोन को कंधे की ऊंचाई पर पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "अब अपने बाएँ हाथ की कोहनी मोड़कर कंधे की ऊँचाई पर अपने फ़ोन को पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "अब अपने दाएँ हाथ की कोहनी मोड़कर कंधे की ऊँचाई पर अपने फ़ोन को पकड़ें।"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "अपनी कोहनी मोड़कर अपने फ़ोन को %ld सेकंड तक पकड़े रखें"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "अब अपनी कोहनी मुड़ी हुई रखकर अपने फ़ोन को बार-बार अपनी नाक से स्पर्श करें।"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "अब अपने बाएँ हाथ में फ़ोन पकड़कर और कोहनी मुड़ी हुई रखकर अपने फ़ोन को बार-बार अपनी नाक से स्पर्श करें।"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "अब अपने दाएँ हाथ में फ़ोन पकड़कर और कोहनी मुड़ी हुई रखकर अपने फ़ोन को बार-बार अपनी नाक से स्पर्श करें।"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "अपने फ़ोन को अपनी नाक से %ld सेकंड तक स्पर्श करते रहें"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "रानी की तरह हाथ हिलाने (अपनी कलाई को मोड़कर हाथ हिलाना) की तैयारी करें।"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "अपने फ़ोन को अपने बाएँ हाथ में रखकर रानी की तरह हाथ हिलाने (अपनी कलाई को मोड़कर हाथ हिलाना) की तैयारी करें।"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "अपने फ़ोन को अपने दाएँ हाथ में रखकर रानी की तरह हाथ हिलाने (अपनी कलाई को मोड़कर हाथ हिलाना) की तैयारी करें।"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "%ld सेकंड तक रानी की तरह हाथ हिलाते रहें।"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "अब अपने फ़ोन को अपने बाएँ हाथ में लें और अगला कार्य जारी रखें।"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "अब अपने फ़ोन को अपने दाएँ हाथ में लें और अगला कार्य जारी रखें।"; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "अगला कार्य जारी रखें।"; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "गतिविधि पूर्ण।"; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "बैठे रहकर फ़ोन को पहले एक हाथ में फिर दूसरे हाथ में पकड़कर आपसे %@ करने के लिए कहा जाएगा।"; +"TREMOR_SKIP_LEFT_HAND" = "इस गतिविधि को मेरे बाएँ हाथ से नहीं किया जा सकता है।"; +"TREMOR_SKIP_RIGHT_HAND" = "इस गतिविधि को मेरे दाएँ हाथ से नहीं किया जा सकता है।"; +"TREMOR_SKIP_NEITHER" = "इस गतिविधि को मेरे दोनों हाथों से किया जा सकता है।"; /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "फ़ाइल नहीं बन सकी"; @@ -357,7 +434,7 @@ "AX_IMAGE_ILLUSTRATION" = "%@ का चित्रांकन"; "AX_SIGNVIEW_LABEL" = "निर्दिष्ट हस्ताक्षर फ़ील्ड"; -"AX_SIGNVIEW_HINT" = "हस्ताक्षर करने के लिए स्क्रीन को स्पर्श करें और अपनी ऊँगली हिलाएँ"; +"AX_SIGNVIEW_HINT" = "हस्ताक्षर करने के लिए स्क्रीन को स्पर्श करें और अपनी उँगली हिलाएँ"; "AX_SIGNVIEW_SIGNED" = "हस्ताक्षरित"; "AX_SIGNVIEW_UNSIGNED" = "अहस्ताक्षरित"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "पूर्वावलोकन को कैप्चर करें"; "AX_IMAGE_CAPTURED_LABEL" = "कैप्चर की हुई छवि"; +"AX_VIDEO_CAPTURE_LABEL" = "वीडियो कैप्चर पूर्वावलोकन"; +"AX_VIDEO_CAPTURED_LABEL" = "कैप्चर किया गया वीडियो"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "%2$@ आकार के डिस्क पर %1$@ आकार के डिस्क को रखने में असमर्थ"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "लक्ष्य"; "AX_TOWER_OF_HANOI_TOWER" = "टॉवर"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "इसमें %@ आकारों के डिस्क हैं "; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "ख़ाली"; -"AX_GRAPH_RANGE_FORMAT" = "%1$@ से %2$@ तक श्रेणी"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "%1$@ से %2$@ तक श्रेणी"; +"AX_GRAPH_STACK_PREFIX" = "निम्नलिखित का संग्रह"; "AX_GRAPH_AND_SEPARATOR" = " और "; "AX_GRAPH_POINT_%@" = "पॉइंट : %@"; diff --git a/ResearchKit/Localized/hi.lproj/locversion.plist b/ResearchKit/Localized/hi.lproj/locversion.plist index 642481bb..8b60e6ec 100644 --- a/ResearchKit/Localized/hi.lproj/locversion.plist +++ b/ResearchKit/Localized/hi.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale hi LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/hr.lproj/ResearchKit.strings b/ResearchKit/Localized/hr.lproj/ResearchKit.strings index f9bcf8a7..c0022a90 100644 --- a/ResearchKit/Localized/hr.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/hr.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Dopušteni su samo numerički znakovi."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indikator napretka unošenja šifre"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ od %@ unesenih znamenki"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Zaboravili ste šifru?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Nije moguće dodati stavku privjeska ključeva."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Ne"; "BOOL_YES" = "Da"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "u"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Dodirnite za odgovaranje"; "NULL_ANSWER" = "Odaberite odgovor"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Spremi za kasnije"; "BUTTON_OPTION_DISCARD" = "Odbaci rezultate"; "BUTTON_OPTION_STOP_TASK" = "Završi zadatak"; +"BUTTON_SAVE" = "Spremi"; +"BUTTON_CLEAR_ANSWER" = "Očisti odgovor"; +"BUTTON_READ_ONLY_MODE" = "Ovaj odgovor se ne može promijeniti."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Započinjanje aktivnosti za"; "TASK_COMPLETE_TITLE" = "Aktivnost je dovršena"; "TASK_COMPLETE_TEXT" = "Vaši podaci će se analizirati i bit ćete obaviješteni kad rezultati budu spremni."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ s preostalo."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Snimi sliku"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Nije naveden izlazni direktorij za snimljene slike."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Snimljena slika ne može se spremiti."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Započni snimati"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Zaustavi snimanje"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Ponovno snimi video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kondicija"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Udaljenost (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Okrenite se i hodajte natrag do mjesta od kojeg ste krenuli."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Hodajte najviše %ld koraka u ravnoj liniji."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Pronađite mjesto na kojem možete sigurno hodati naprijed-natrag u ravnoj liniji. Pokušajte kontinuirano hodati tako da se okrenete na kraju putanje, kao da hodate oko čunja.\n\nZatim će se od vas zatražiti da hodate punim krugom, zatim da stojite nepomično s rukama položenim uz tijelo i stopalima razmaknutima u širini ramena."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Dodirnite Pokreni kad budete spremni započeti.\nZatim stavite vaš telefon u džep ili torbu i slijedite audio upute."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Hodajte naprijed-natrag u ravnoj liniji tijekom %@. Hodajte kao i inače."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Okrenite se punim krugom i zatim budite mirni %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Dovršili ste aktivnost."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Brzina dodirivanja"; +"TAPPING_TASK_TITLE_RIGHT" = "Desna ruka"; +"TAPPING_TASK_TITLE_LEFT" = "Lijeva ruka"; "TAPPING_INTRO_TEXT" = "Ova aktivnost mjeri vašu brzinu dodirivanja."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Stavite telefon na ravnu podlogu. Na zaslonu će se prikazati dvije tipke za %@. Koristeći dva prsta iste ruke, naizmjence dodirujte tipke što brže možete."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Stavite telefon na ravnu podlogu."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Koristeći dva prsta iste ruke, naizmjence dodirujte tipke na zaslonu."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Koristeći dva prsta desne ruke, naizmjence dodirujte tipke na zaslonu."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Koristeći dva prsta lijeve ruke, naizmjence dodirujte tipke na zaslonu."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Sad ponovite isti test desnom rukom."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Sad ponovite isti test lijevom rukom."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Dodirnite jednim prstom, zatim drugim. Pokušajte tempirati dodire kako bi bili ujednačeni. Nastavite dodirivati tijekom %@."; "TAPPING_CALL_TO_ACTION" = "Dodirnite Pokreni za početak."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Dodirnite Sljedeće za početak."; "TAP_BUTTON_TITLE" = "Dodirnite"; "TOTAL_TAPS_LABEL" = "Ukupan broj dodira"; -"TAPPING_INSTRUCTION" = "Dodirujte tipke što brže možete koristeći dva prsta."; - +"TAPPING_INSTRUCTION" = "Dodirujte tipke što ujednačenije možete koristeći dva prsta."; +"TAPPING_INSTRUCTION_RIGHT" = "Dodirujte tipke koristeći DESNU ruku."; +"TAPPING_INSTRUCTION_LEFT" = "Dodirujte tipke koristeći LIJEVU ruku."; +"TAPPING_SKIP_TITLE" = "Preskoči ovu ruku"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Glas"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Ova aktivnost evaluira vaš glas tako što ga snima pomoću mikrofona na dnu vašeg telefona."; "AUDIO_TOO_LOUD_LABEL" = "Preglasno"; "AUDIO_GENERIC_ERROR_LABEL" = "Zvuk se ne može snimati"; +"AUDIO_LEVEL_CHECK_LABEL" = "Molimo, pričekajte da provjerimo razinu pozadinske buke."; +"AUDIO_TOO_LOUD_MESSAGE" = "Razina buke u okruženju je previsoka za snimanje vašeg glasa. Molimo, premjestite se negdje gdje je tiše i pokušajte ponovno."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Dodirnite Sljedeće kad budete spremni."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tonalna audiometrija"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Podignite klin s dva prsta."; "HOLE_PEG_TEST_TEXT_2" = "Podignite prste da biste ispustili klin."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Aktivnost podrhtavanja"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Ova aktivnost mjeri podrhtavanje vaših ruku u različitim položajima. Pronađite mjesto na kojem možete udobno sjediti tijekom trajanja ove aktivnosti."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Držite telefon u ruci koja vam je više zahvaćena, kako je prikazano na slici ispod."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Držite telefon u DESNOJ ruci kako je prikazano na slici ispod."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Držite telefon u LIJEVOJ ruci kako je prikazano na slici ispod."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Od vas će se zatražiti da napravite %@ dok sjedite s telefonom u ruci."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "zadatak"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dva zadatka"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tri zadatka"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "četiri zadatka"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "pet zadataka"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Dodirnite Sljedeće za nastavak."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Pripremite se na držanje telefona u krilu."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Pripremite se na držanje telefona u krilu LIJEVOM rukom."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Pripremite se na držanje telefona u krilu DESNOM rukom."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Nastavite držati telefon u krilu tijekom %ld s."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Sad držite telefon s ispruženom rukom u visini ramena."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Sad držite telefon u LIJEVOJ šaci s rukom ispruženom u visini ramena."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Sad držite telefon u DESNOJ šaci s rukom ispruženom u visini ramena."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Nastavite držati telefon s ispruženom rukom tijekom %ld s."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Sad držite telefon u visini ramena sa savijenim laktom."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Sad držite telefon LIJEVOM rukom u visini ramena sa savijenim laktom."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Sad držite telefon DESNOM rukom u visini ramena sa savijenim laktom."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Nastavite držati telefon sa savijenim laktom tijekom %ld s"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Sad držite lakat savijen i neprekidno dodirujte nos telefonom."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Sad držite lakat savijen s telefonom u LIJEVOJ ruci i neprekidno dodirujte nos telefonom."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Sad držite lakat savijen s telefonom u DESNOJ ruci i neprekidno dodirujte nos telefonom."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Nastavite dodirivati nos telefonom tijekom %ld s"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Pripremite se za mahanje rotiranjem šake u zapešću (kao što maše engleska kraljica)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Pripremite se za mahanje rotiranjem šake, s telefonom u LIJEVOJ ruci (kao što maše engleska kraljica)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Pripremite se za mahanje rotiranjem šake, s telefonom u DESNOJ ruci (kao što maše engleska kraljica)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Nastavite mahati rotiranjem šake tijekom %ld s."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Sad uzmite telefon u LIJEVU ruku i nastavite na sljedeći zadatak."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Sad uzmite telefon u DESNU ruku i nastavite na sljedeći zadatak."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Nastavite na sljedeći zadatak."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivnost je dovršena."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Od vas će se zatražiti da napravite %@ dok sjedite s telefonom prvo u jednoj ruci, zatim ponovno u drugoj ruci."; +"TREMOR_SKIP_LEFT_HAND" = "Ne mogu obaviti ovaj zadatak LIJEVOM rukom."; +"TREMOR_SKIP_RIGHT_HAND" = "Ne mogu obaviti ovaj zadatak DESNOM rukom."; +"TREMOR_SKIP_NEITHER" = "Mogu obaviti ovaj zadatak s obje ruke."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Datoteka se ne može izraditi"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Nije se moglo ukloniti dovoljno log datoteka za dosezanje praga"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Snimi pregled"; "AX_IMAGE_CAPTURED_LABEL" = "Snimljena slika"; +"AX_VIDEO_CAPTURE_LABEL" = "Pregled snimanja videa"; +"AX_VIDEO_CAPTURED_LABEL" = "Snimljeni video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Pločica veličine %@ ne može se staviti na pločicu veličine %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Cilj"; "AX_TOWER_OF_HANOI_TOWER" = "Toranj"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Ima pločicu veličine %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Isprazni"; -"AX_GRAPH_RANGE_FORMAT" = "Raspon od %@ do %@."; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Raspon od %@ do %@."; +"AX_GRAPH_STACK_PREFIX" = "Stog sastavljen od"; "AX_GRAPH_AND_SEPARATOR" = " i "; "AX_GRAPH_POINT_%@" = "Točka: %@"; diff --git a/ResearchKit/Localized/hr.lproj/locversion.plist b/ResearchKit/Localized/hr.lproj/locversion.plist index 6ec5a9be..e6f0479b 100644 --- a/ResearchKit/Localized/hr.lproj/locversion.plist +++ b/ResearchKit/Localized/hr.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale hr LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/hu.lproj/ResearchKit.strings b/ResearchKit/Localized/hu.lproj/ResearchKit.strings index 41db6797..7d25ae11 100644 --- a/ResearchKit/Localized/hu.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/hu.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Kizárólag számkarakterek engedélyezettek."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Jelkóddal történő belépés folyamatjelzője"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@/%@ számjegy megadva"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Elfelejtette a jelkódot?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Nem lehetett hozzáadni a Kulcskarika-elemet."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nem"; "BOOL_YES" = "Igen"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Koppintson a válaszhoz"; "NULL_ANSWER" = "Válasz kiválasztása"; @@ -188,12 +194,16 @@ "BUTTON_START_TIMER" = "Időzítő indítása"; "BUTTON_OPTION_SAVE" = "Mentés későbbre"; "BUTTON_OPTION_DISCARD" = "Eredmények elvetése"; -"BUTTON_OPTION_STOP_TASK" = "Feladat vége"; +"BUTTON_OPTION_STOP_TASK" = "Feladat befejezése"; +"BUTTON_SAVE" = "Mentés"; +"BUTTON_CLEAR_ANSWER" = "Válasz törlése"; +"BUTTON_READ_ONLY_MODE" = "Ez a válasz nem módosítható."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Tevékenység indítása:"; "TASK_COMPLETE_TITLE" = "Tevékenység befejezve"; "TASK_COMPLETE_TEXT" = "Az adatok ki lesznek elemezve, és értesítést fog kapni, ha az eredmény elkészült."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ másodperc van hátra."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Kép készítése"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Az elkészített képekhez nem lett megadva kimeneti könyvtár."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Az elkészített képet nem sikerült menteni."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Felvétel indítása"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Felvétel leállítása"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Videó ismételt rögzítése"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitnesz"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Távolság (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Forduljon meg, és menjen vissza a kiindulási ponthoz."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Tegyen meg legalább %ld lépést egyenesen."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Keressen egy olyan helyet, ahol egyenes vonalban tud oda-vissza gyalogolni. Próbáljon meg folyamatosan gyalogolni, és a végeken úgy forduljon meg, mintha egy útjelző bóját kerülne meg.\n\nEzután utasítást fog kapni, hogy fogduljon meg egy teljes kört megtéve, majd álljon meg, engedje le a törzse mellett karjait, és álljon vállszélességű terpeszben."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Koppintson a Kezdés elemre, amikor készen áll.\nEzután tegye a telefont a zsebébe vagy a táskájába, és kövesse a hangutasításokat."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Gyalogoljon oda-vissza egy egyenes vonal mentén ennyi ideig: %@. A szokásos tempójában gyalogoljon."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Forduljon meg egy teljes kör mentén, és álljon mozdulatlanul ennyi ideig: %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Befejezte a tevékenységet."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Koppintási sebesség"; +"TAPPING_TASK_TITLE_RIGHT" = "Jobb kéz"; +"TAPPING_TASK_TITLE_LEFT" = "Bal kéz"; "TAPPING_INTRO_TEXT" = "Ez a tevékenység megméri a koppintási sebességét."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Helyezze a telefont egy sima felületre. Két gomb jelenik meg a képernyőn a következőhöz: %@. Egy kezének két ujjával felváltva koppintson a megjelenő gombokra olyan gyorsan, ahogy csak tud."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Tegye a telefont egy vízszintes felületre."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Ugyanannak a kezének két ujjával felváltva koppintson a gombokra a kijelzőn."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "A jobb kezének két ujjával felváltva koppintson a gombokra a kijelzőn."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "A bal kezének két ujjával felváltva koppintson a gombokra a kijelzőn."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Most ismételje meg ugyanezt a tesztet jobb kézzel."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Most ismételje meg ugyanezt a tesztet bal kézzel."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Koppintson az egyik, majd a másik ujjával. Próbáljon meg egyenletes időközönként koppintani. Folytassa a koppintásokat ennyi ideig: %@."; "TAPPING_CALL_TO_ACTION" = "A kezdéshez koppintson a Kezdés elemre."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Koppintson\na Következő elemre\na kezdéshez."; "TAP_BUTTON_TITLE" = "Koppintás"; "TOTAL_TAPS_LABEL" = "Összes koppintás"; -"TAPPING_INSTRUCTION" = "Két ujjal koppintson a gombokra olyan gyorsan, ahogy csak tud."; - +"TAPPING_INSTRUCTION" = "Két ujjal koppintson a gombokra olyan egyenletesen, ahogy csak tud."; +"TAPPING_INSTRUCTION_RIGHT" = "Koppintson a gombokra JOBB kézzel."; +"TAPPING_INSTRUCTION_LEFT" = "Koppintson a gombokra BAL kézzel."; +"TAPPING_SKIP_TITLE" = "Kéz kihagyása"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Hang"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Ez a tevékenység kiértékeli a hangját, rögzítve, ahogy a telefon alján lévő mikrofonba beszél."; "AUDIO_TOO_LOUD_LABEL" = "Túl hangos"; "AUDIO_GENERIC_ERROR_LABEL" = "Nem sikerült hangot felvenni"; +"AUDIO_LEVEL_CHECK_LABEL" = "Kérjük, várjon, amíg ellenőrizzük a háttérzaj szintjét."; +"AUDIO_TOO_LOUD_MESSAGE" = "A környezeti zaj szinte túl magas a hangja felvételéhez. Kérjük, menjen csendesebb helyre, és próbálkozzon újra."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Koppintson a Következő elemre, amikor készen áll."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Hangaudiometria"; @@ -296,7 +331,7 @@ "TIMED_WALK_TITLE" = "Időre mért gyaloglás"; "TIMED_WALK_INTRO_DETAIL" = "Ez a tevékenység az alsó végtagok működését méri."; "TIMED_WALK_INTRO_2_TEXT_%@" = "Keressen olyan helyet, lehetőleg kültéren, ahol %@ ideig egyenesen tud gyalogolni olyan gyorsan, ahogy csak tud, de biztonságosan. Ne lassítson le, amíg el nem hagyta a célvonalat."; -"TIMED_WALK_INTRO_2_DETAIL" = "Koppintson\na Tovább elemre\na kezdéshez."; +"TIMED_WALK_INTRO_2_DETAIL" = "Koppintson\na Következő elemre\na kezdéshez."; "TIMED_WALK_FORM_TITLE" = "Segítőeszköz"; "TIMED_WALK_FORM_TEXT" = "Ugyanazt a segítőeszközt használja minden teszthez."; "TIMED_WALK_QUESTION_TEXT" = "Használ boka-járáskönnyítőt?"; @@ -321,7 +356,7 @@ "PAVSAT_INTRO_TEXT" = "Az Ütemes hallási és vizuális sorozatösszeadási teszt a hallási és vizuális információfeldolgozási sebességet és számítási képességet méri."; "PSAT_INTRO_TEXT_2_%@" = "%@ másodpercenként számjegyek jelennek meg.\nMinden új számjegyet adjon hozzá az előtte lévőhöz.\nFigyelem: Ne számítsa ki a teljes sorozat összegét, csak az utolsó két számjegy összegét."; "PSAT_CALL_TO_ACTION" = "A kezdéshez koppintson a Kezdés elemre."; -"PSAT_INITIAL_INSTRUCTION" = "Jegyezze meg ezt az első számkegyet."; +"PSAT_INITIAL_INSTRUCTION" = "Jegyezze meg ezt az első számjegyet."; "PSAT_INSTRUCTION" = "Adja hozzá ezt az új számjegyet az előzőhöz."; "PSAT_NO_DIGIT" = "-"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Fogja meg a kört két ujjal."; "HOLE_PEG_TEST_TEXT_2" = "Emelje fel az ujjait a kör elhelyezéséhez."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Remegési tevékenység"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Ez a tevékenység a keze remegését méri különböző helyzetekben. Keressen egy olyan helyet, ahol kényelmesen le tud ülni a tevékenység idejére."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Tartsa a telefont a gyakrabban használt kezében, a képen látható módon."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Tartsa a telefont a JOBB kezében, a képen látható módon."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Tartsa a telefont a BAL kezében, a képen látható módon."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "A rendszer fel fogja kérni a(z) %@ végrehajtására, miközben ül a telefonnal a kezében."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "egy feladat"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "két feladat"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "három feladat"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "négy feladat"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "öt feladat"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Koppintson a Következő elemre a folytatáshoz."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Készüljön fel arra, hogy a telefont az ölében tartsa."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Készüljön fel arra, hogy a telefont a BAL kezével az ölében tartsa."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Készüljön fel arra, hogy a telefont a JOBB kezével az ölében tartsa."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Tartsa az ölében a telefont %ld másodpercig."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Most tartsa a telefont kinyújtott karral vállmagasságban."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Most tartsa a telefont kinyújtott karral, BAL kézzel vállmagasságban."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Most tartsa a telefont kinyújtott karral, JOBB kézzel vállmagasságban."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Tartsa a telefont kinyújtott karral %ld másodpercig."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Most tartsa a telefont behajlított könyökkel vállmagasságban."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Most tartsa a telefont behajlított könyökkel, BAL kézzel vállmagasságban."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Most tartsa a telefont behajlított könyökkel, JOBB kézzel vállmagasságban."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Tartsa a telefont behajlított könyökkel %ld másodpercig."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Most a könyökét behajlítva érintse többször az orrához a telefont."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Most tartsa a telefont BAL kézzel, a könyökét behajlítva, és érintse többször az orrához a telefont."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Most tartsa a telefont JOBB kézzel, a könyökét behajlítva, és érintse többször az orrához a telefont."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Érintse a telefont az orrához %ld másodpercig."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Forgassa a felemelt csuklóját (mintha integetne)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Forgassa a felemelt BAL csuklóját a telefonnal a kezében (mintha integetne)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Forgassa a felemelt JOBB csuklóját a telefonnal a kezében (mintha integetne)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Forgassa a felemelt csuklóját %ld másodpercig."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Most tegye át a telefont a BAL kezébe, és folytassa a következő feladattal."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Most tegye át a telefont a JOBB kezébe, és folytassa a következő feladattal."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Folytatás a következő feladattal."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Tevékenység befejezve."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "A rendszer fel fogja kérni a(z) %@ végrehajtására, miközben ül a telefonnal az egyik kezében, majd a másik kezében."; +"TREMOR_SKIP_LEFT_HAND" = "A BAL kezemmel nem tudom elvégezni ezt a feladatot."; +"TREMOR_SKIP_RIGHT_HAND" = "A JOBB kezemmel nem tudom elvégezni ezt a feladatot."; +"TREMOR_SKIP_NEITHER" = "Mindkét kézzel el tudom végezni ezt a feladatot."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "A fájl nem hozható létre"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Nem sikerült elég naplófájlt eltávolítani a küszöb eléréséhez"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Előnézet rögzítése"; "AX_IMAGE_CAPTURED_LABEL" = "Készített kép"; +"AX_VIDEO_CAPTURE_LABEL" = "Videorögzítés előnézete"; +"AX_VIDEO_CAPTURED_LABEL" = "Rögzített videó"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Nem helyezhető %@ méretű korong %@ méretű korongra"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Cél"; "AX_TOWER_OF_HANOI_TOWER" = "Torony"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "A következő méretű korongokat tárolja: %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Üres"; -"AX_GRAPH_RANGE_FORMAT" = "Tartomány ettől: %@ eddig: %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Tartomány ettől: %@ eddig: %@"; +"AX_GRAPH_STACK_PREFIX" = "Halom a következőkből:"; "AX_GRAPH_AND_SEPARATOR" = " és "; "AX_GRAPH_POINT_%@" = "Pont: %@"; diff --git a/ResearchKit/Localized/hu.lproj/locversion.plist b/ResearchKit/Localized/hu.lproj/locversion.plist index 6670f15a..d51d72eb 100644 --- a/ResearchKit/Localized/hu.lproj/locversion.plist +++ b/ResearchKit/Localized/hu.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale hu LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/id.lproj/ResearchKit.strings b/ResearchKit/Localized/id.lproj/ResearchKit.strings index 65caf897..3a2cce1d 100644 --- a/ResearchKit/Localized/id.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/id.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Hanya karakter numerik yang diizinkan."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indikator kemajuan entri kode sandi"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ dari %@ digit dimasukkan"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Lupa Kode Sandi?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Tidak dapat menambah item Rantai Kunci."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Tidak"; "BOOL_YES" = "Ya"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "kaki"; +"MEASURING_UNIT_IN" = "inci"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Ketuk untuk menjawab"; "NULL_ANSWER" = "Pilih jawaban"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Simpan untuk Nanti"; "BUTTON_OPTION_DISCARD" = "Hapus Hasil"; "BUTTON_OPTION_STOP_TASK" = "Akhiri Tugas"; +"BUTTON_SAVE" = "Simpan"; +"BUTTON_CLEAR_ANSWER" = "Bersihkan jawaban"; +"BUTTON_READ_ONLY_MODE" = "Jawaban ini tidak dapat dimodifikasi."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Memulai aktivitas dalam"; "TASK_COMPLETE_TITLE" = "Aktivitas Selesai"; "TASK_COMPLETE_TEXT" = "Data Anda akan dianalisis dan Anda akan diberi tahu setelah hasil Anda siap."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Tersisa %@ detik."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Ambil Gambar"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Tidak ada direktori output yang ditentukan untuk gambar yang diambil."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Gambar yang diambil tidak dapat disimpan."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Mulai Merekam"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Berhenti Merekam"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Ambil Ulang Video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kebugaran"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Jarak (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Putar balik, dan kembali ke tempat Anda memulai."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Berjalan kaki hingga %ld langkah dalam garis lurus."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Cari tempat untuk dapat berjalan bolak-balik di jalur lurus dengan aman. Coba terus berjalan dengan berbelok di akhir jalur Anda, seolah-olah berjalan mengitari kerucut.\n\nSelanjutnya Anda akan diinstruksikan untuk berputar dalam lingkaran penuh, lalu tetap berdiri dengan lengan berada di samping dan kaki terbuka selebar bahu."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Ketuk Mulai saat Anda siap untuk memulai.\nLalu letakkan telepon Anda di saku atau tas dan ikuti instruksi audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Jalan bolak-balik di jalur lurus selama %@. Jalan dengan normal."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Berputar dalam lingkaran penuh lalu tetap berdiri selama %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Anda telah menyelesaikan aktivitas."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Kecepatan Mengetuk"; +"TAPPING_TASK_TITLE_RIGHT" = "Tangan Kanan"; +"TAPPING_TASK_TITLE_LEFT" = "Tangan Kiri"; "TAPPING_INTRO_TEXT" = "Aktivitas ini mengukur kecepatan mengetuk Anda."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Letakkan telepon Anda di permukaan rata. Dua tombol akan muncul di layar Anda selama %@. Dengan menggunakan dua jari di tangan yang sama, ketuk tombol secara bergantian secepat Anda bisa."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Letakkan telepon Anda di permukaan datar."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Gunakan dua jari pada tangan yang sama untuk mengetuk tombol di layar secara bergantian."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Gunakan dua jari pada tangan kanan Anda untuk mengetuk tombol di layar secara bergantian."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Gunakan dua jari pada tangan kiri Anda untuk mengetuk tombol di layar secara bergantian."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Sekarang ulangi tes yang sama menggunakan tangan kanan."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Sekarang ulangi tes yang sama menggunakan tangan kiri."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Ketuk dengan satu jari, lalu jari lainnya. Sebisa mungkin, coba atur ketukan Anda agar seimbang. Terus mengetuk selama %@."; "TAPPING_CALL_TO_ACTION" = "Ketuk Mulai untuk memulai."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Ketuk Berikutnya untuk memulai."; "TAP_BUTTON_TITLE" = "Ketuk"; "TOTAL_TAPS_LABEL" = "Total Ketukan"; -"TAPPING_INSTRUCTION" = "Ketuk tombol secepat Anda bisa menggunakan dua jari."; - +"TAPPING_INSTRUCTION" = "Ketuk tombol sekonsisten mungkin menggunakan dua jari."; +"TAPPING_INSTRUCTION_RIGHT" = "Ketuk tombol menggunakan tangan KANAN Anda."; +"TAPPING_INSTRUCTION_LEFT" = "Ketuk tombol menggunakan tangan KIRI Anda."; +"TAPPING_SKIP_TITLE" = "Lewati tangan Ini"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Suara"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Tes ini mengevaluasi suara Anda dengan merekamnya saat Anda berbicara melalui mikrofon di bagian bawah telepon Anda."; "AUDIO_TOO_LOUD_LABEL" = "Terlalu Keras"; "AUDIO_GENERIC_ERROR_LABEL" = "Tidak dapat merekam audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Harap tunggu saat kami memeriksa level kebisingan latar belakang."; +"AUDIO_TOO_LOUD_MESSAGE" = "Level kebisingan di sekitar terlalu kencang untuk merekam suara Anda. Pindah ke tempat lain yang lebih hening dan coba lagi."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Ketuk Berikutnya saat sudah siap."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometri Nada"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Ambil sumbat dengan dua jari."; "HOLE_PEG_TEST_TEXT_2" = "Angkat jari untuk menjatuhkan sumbat."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Aktivitas Tremor"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Aktivitas ini mengukur tremor tangan Anda dalam berbagai posisi. Cari tempat yang dapat Anda gunakan untuk duduk dengan nyaman selama durasi aktivitas ini."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Genggam telepon di tangan yang terkena dampak lebih besar seperti yang ditampilkan dalam gambar di bawah."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Genggam telepon Anda di tangan KANAN seperti yang ditampilkan dalam gambar di bawah."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Genggam telepon Anda di tangan KIRI seperti yang ditampilkan dalam gambar di bawah."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Anda akan diminta untuk melakukan %@ saat duduk dengan telepon di tangan Anda."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "sebuah tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dua tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tiga tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "empat tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "lima tugas"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Ketuk berikutnya untuk melanjutkan."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Bersiap untuk menggenggam telepon di pangkuan."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Bersiap untuk menggenggam telepon di pangkuan dengan tangan KIRI."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Bersiap untuk menggenggam telepon di pangkuan dengan tangan KANAN."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Terus genggam telepon Anda di pangkuan selama %ld detik."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Sekarang genggam telepon Anda dengan tangan terentang setinggi bahu."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Sekarang genggam telepon Anda dengan tangan KIRI terentang setinggi bahu."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Sekarang genggam telepon Anda dengan tangan KANAN terentang setinggi bahu."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Terus genggam telepon Anda dengan tangan terentang selama %ld detik."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Sekarang genggam telepon Anda setinggi bahu dengan siku ditekuk."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Sekarang genggam telepon Anda dengan tangan KIRI setinggi bahu dengan siku ditekuk."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Sekarang genggam telepon Anda dengan tangan KANAN setinggi bahu dengan siku ditekuk."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Terus genggam telepon dengan siku ditekuk selama %ld detik"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Sekarang siku tetap ditekuk, sentuhkan telepon ke hidung Anda berulang kali."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Sekarang siku tetap ditekuk dengan telepon di tangan KIRI, sentuhkan telepon ke hidung Anda berulang kali."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Sekarang siku tetap ditekuk dengan telepon di tangan KANAN, sentuhkan telepon ke hidung Anda berulang kali."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Terus sentuhkan telepon ke hidung Anda selama %ld detik"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Bersiap untuk melakukan lambaian tangan ratu (melambai dengan memutar pergelangan tangan)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Bersiap untuk melakukan lambaian tangan ratu dengan telepon di tangan KIRI Anda (melambai dengan memutar pergelangan tangan)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Bersiap untuk melakukan lambaian tangan ratu dengan telepon di tangan KANAN Anda (melambai dengan memutar pergelangan tangan)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Terus lakukan lambaian tangan ratu selama %ld detik."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Sekarang pindahkan telepon ke tangan KIRI dan lanjutkan ke tugas berikutnya."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Sekarang pindahkan telepon ke tangan KANAN dan lanjutkan ke tugas berikutnya."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Lanjutkan ke tugas berikutnya."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivitas selesai."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Anda akan diminta untuk melakukan %@ saat duduk dengan telepon di satu tangan lebih dahulu, lalu melakukan lagi dengan tangan lainnya."; +"TREMOR_SKIP_LEFT_HAND" = "Saya tidak dapat melakukan aktivitas ini dengan tangan KIRI."; +"TREMOR_SKIP_RIGHT_HAND" = "Saya tidak dapat melakukan aktivitas ini dengan tangan KANAN."; +"TREMOR_SKIP_NEITHER" = "Saya dapat melakukan aktivitas ini dengan kedua tangan."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Tidak dapat membuat file"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Tidak dapat menghapus cukup file log untuk mencapai ambang"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Pratinjau gambar"; "AX_IMAGE_CAPTURED_LABEL" = "Gambar terambil"; +"AX_VIDEO_CAPTURE_LABEL" = "Pratinjau pengambilan video"; +"AX_VIDEO_CAPTURED_LABEL" = "Video terambil"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Tidak dapat meletakkan disk dengan ukuran %@ pada disk dengan ukuran %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Target"; "AX_TOWER_OF_HANOI_TOWER" = "Menara"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Memiliki disk dengan ukuran %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Kosong"; -"AX_GRAPH_RANGE_FORMAT" = "Berkisar dari %@ hingga %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Berkisar dari %@ hingga %@"; +"AX_GRAPH_STACK_PREFIX" = "Tumpukan terdiri dari"; "AX_GRAPH_AND_SEPARATOR" = " dan "; "AX_GRAPH_POINT_%@" = "Poin: %@"; diff --git a/ResearchKit/Localized/id.lproj/locversion.plist b/ResearchKit/Localized/id.lproj/locversion.plist index 273df5fb..d7a8ab65 100644 --- a/ResearchKit/Localized/id.lproj/locversion.plist +++ b/ResearchKit/Localized/id.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale id LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/it.lproj/ResearchKit.strings b/ResearchKit/Localized/it.lproj/ResearchKit.strings index df2e2628..ec7070b5 100644 --- a/ResearchKit/Localized/it.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/it.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Sono consentiti solo caratteri numerici."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicatore progresso inserimento codice"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ di %@ cifre inserite"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Hai dimenticato il codice?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Impossibile aggiungere l'elemento del portachiavi."; @@ -167,6 +168,11 @@ "BOOL_NO" = "No"; "BOOL_YES" = "Sì"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "piedi"; +"MEASURING_UNIT_IN" = "pollici"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Tocca per rispondere"; "NULL_ANSWER" = "Seleziona una risposta"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Salva e continua in seguito"; "BUTTON_OPTION_DISCARD" = "Ignora i risultati"; "BUTTON_OPTION_STOP_TASK" = "Fine attività"; +"BUTTON_SAVE" = "Salva"; +"BUTTON_CLEAR_ANSWER" = "Cancella risposta"; +"BUTTON_READ_ONLY_MODE" = "La risposta non può essere modificata."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Inizio attività tra"; -"TASK_COMPLETE_TITLE" = "Attività completa"; +"TASK_COMPLETE_TITLE" = "Attività completata"; "TASK_COMPLETE_TEXT" = "I dati verranno analizzati, riceverai una notifica quando i risultati saranno pronti."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ secondi rimanenti."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Scatta foto"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Non è stata specificata nessuna directory di output per le immagini acquisite."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "L'immagine acquisita non può essere salvata."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Avvia registrazione"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Interrompi registrazione"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Riacquisisci video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Forma fisica"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distanza (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Girati e torna verso il punto in cui hai cominciato a camminare."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Fai fino a %ld passi in linea retta."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Trova un luogo dove puoi camminare in sicurezza avanti e indietro in linea retta. Cerca di camminare senza interruzione girandoti alla fine del percorso come se camminassi attorno a un cono.\n\nSuccessivamente ti verrà chiesto di girare in un cerchio completo, quindi di fermarti con le braccia lungo il corpo e i piedi circa alla larghezza delle spalle."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tocca Inizia quando sei pronto a cominciare.\nQuindi posiziona il telefono in tasca o in borsa e segui le istruzioni audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Cammina avanti e indietro in linea retta per %@. Cammina come faresti normalmente."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Gira in un cerchio completo, quindi fermati per %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Hai completato l'attività."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Velocità tocco"; +"TAPPING_TASK_TITLE_RIGHT" = "Mano destra"; +"TAPPING_TASK_TITLE_LEFT" = "Mano sinistra"; "TAPPING_INTRO_TEXT" = "L'attività misura la velocità dei tocchi che esegui."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Appoggia iPhone su una superficie piatta. Vedrai comparire due pulsanti per %@. Toccali in modo alternato il più velocemente possibile con due dita della stessa mano."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Posiziona il telefono su una superficie piana."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Utilizza due dita della stessa mano per toccare alternativamente i pulsanti sullo schermo."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Utilizza due dita della mano destra per toccare alternativamente i pulsanti sullo schermo."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Utilizza due dita della mano sinistra per toccare alternativamente i pulsanti sullo schermo."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Ora ripeti lo stesso test con la mano destra."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Ora ripeti lo stesso test con la mano sinistra."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tocca con un dito, quindi con l'altro. Cerca di effettuare i tocchi con un ritmo più regolare possibile. Continua a toccare per %@."; "TAPPING_CALL_TO_ACTION" = "Tocca Inizia per cominciare."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tocca Avanti per iniziare."; "TAP_BUTTON_TITLE" = "Tocca"; "TOTAL_TAPS_LABEL" = "Totale tocchi"; -"TAPPING_INSTRUCTION" = "Tocca i pulsanti il più velocemente possibile usando due dita."; - +"TAPPING_INSTRUCTION" = "Tocca i pulsanti il più regolarmente possibile usando due dita."; +"TAPPING_INSTRUCTION_RIGHT" = "Tocca i pulsanti usando la mano DESTRA."; +"TAPPING_INSTRUCTION_LEFT" = "Tocca i pulsanti usando la mano SINISTRA."; +"TAPPING_SKIP_TITLE" = "Salta la mano"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voce"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "L'attività valuta la tua voce registrandola tramite il microfono di iPhone."; "AUDIO_TOO_LOUD_LABEL" = "Volume troppo alto"; "AUDIO_GENERIC_ERROR_LABEL" = "Impossibile registrare l'audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Attendi la verifica del livello di rumore di sottofondo."; +"AUDIO_TOO_LOUD_MESSAGE" = "Il livello di rumore ambientale è troppo alto per registrare la tua voce. Spostati in un luogo più silenzioso e riprova."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tocca Avanti quando sei pronto."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometria tonale"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Seleziona l'icona colorata utilizzando due dita."; "HOLE_PEG_TEST_TEXT_2" = "Solleva le dita per rilasciare l'icona colorata."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Attività tremore"; +"TREMOR_TEST_INTRO_1_DETAIL" = "L'attività misura il tremore delle mani in varie posizioni. Trova un luogo dove puoi sederti comodamente per la durata dell'attività."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Tieni il telefono nella mano maggiormente interessata come mostrato nell'immagine sotto."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Tieni il telefono nella mano DESTRA come mostrato nell'immagine sotto."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Tieni il telefono nella mano SINISTRA come mostrato nell'immagine sotto."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Ti verrà richiesto di eseguire %@ mentre stai seduto con il telefono in mano."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "un'attività"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "due attività"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tre attività"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "quattro attività"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinque attività"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tocca Avanti per procedere."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Preparati a tenere il telefono in grembo."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Preparati a tenere il telefono in grembo con la mano SINISTRA."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Preparati a tenere il telefono in grembo con la mano DESTRA."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Continua a tenere il telefono in grembo per %ld secondi."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Ora tieni il telefono con la mano distesa all'altezza della spalla."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Ora tieni il telefono con la mano SINISTRA distesa all'altezza della spalla."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Ora tieni il telefono con la mano DESTRA distesa all'altezza della spalla."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Continua a tenere il telefono con la mano distesa per %ld secondi."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Ora tieni il telefono all'altezza della spalla con il gomito piegato."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Ora tieni il telefono con la mano SINISTRA all'altezza della spalla con il gomito piegato."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Ora tieni il telefono con la mano DESTRA all'altezza della spalla con il gomito piegato."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Continua a tenere il telefono con il gomito piegato per %ld secondi"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Ora, tenendo il gomito piegato, tocca ripetutamente il telefono sul naso."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Ora, tenendo il gomito piegato con il telefono nella mano SINISTRA, tocca ripetutamente il telefono sul naso."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Ora, tenendo il gomito piegato con il telefono nella mano DESTRA, tocca ripetutamente il telefono sul naso."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Continua a toccare il telefono sul naso per %ld secondi"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Preparati a ruotare ripetutamente il polso a destra e a sinistra."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Preparati a ruotare ripetutamente il polso a destra e a sinistra con la mano SINISTRA."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Preparati a ruotare ripetutamente il polso a destra e a sinistra con la mano DESTRA."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Continua a ruotare il polso a destra e a sinistra per %ld secondi."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Ora passa il telefono alla mano SINISTRA e continua con l'attività successiva."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Ora passa il telefono alla mano DESTRA e continua con l'attività successiva."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Continua con l'attività successiva."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Attività completata."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Ti verrà richiesto di eseguire %@ mentre stai seduto con il telefono prima in una mano, poi di nuovo nell'altra."; +"TREMOR_SKIP_LEFT_HAND" = "Non posso eseguire l'attività con la mano SINISTRA."; +"TREMOR_SKIP_RIGHT_HAND" = "Non posso eseguire l'attività con la mano DESTRA."; +"TREMOR_SKIP_NEITHER" = "Posso eseguire l'attività con entrambe le mani."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Impossibile creare file"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Impossibile rimuovere file di log sufficienti per raggiungere la soglia"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Anteprima immagine"; "AX_IMAGE_CAPTURED_LABEL" = "Immagine scattata"; +"AX_VIDEO_CAPTURE_LABEL" = "Anteprima acquisizione video"; +"AX_VIDEO_CAPTURED_LABEL" = "Video acquisito"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Impossibile posizionare il disco di dimensione %@ sul disco di dimensione %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Destinazione"; "AX_TOWER_OF_HANOI_TOWER" = "Torre"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Dimensioni dischi: %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Vuota"; -"AX_GRAPH_RANGE_FORMAT" = "Intervallo da %@ a %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Intervallo da %@ a %@"; +"AX_GRAPH_STACK_PREFIX" = "Pila composta da"; "AX_GRAPH_AND_SEPARATOR" = " e "; "AX_GRAPH_POINT_%@" = "Punto: %@"; diff --git a/ResearchKit/Localized/it.lproj/locversion.plist b/ResearchKit/Localized/it.lproj/locversion.plist index 0716a7ff..bd8f3a6e 100644 --- a/ResearchKit/Localized/it.lproj/locversion.plist +++ b/ResearchKit/Localized/it.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale it LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/ja.lproj/ResearchKit.strings b/ResearchKit/Localized/ja.lproj/ResearchKit.strings index 87b63c57..cdd6ad5a 100644 --- a/ResearchKit/Localized/ja.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ja.lproj/ResearchKit.strings @@ -102,7 +102,7 @@ /* Registration step */ "EMAIL_FORM_ITEM_TITLE" = "メール"; -"EMAIL_FORM_ITEM_PLACEHOLDER" = "jappleseed@example.com"; +"EMAIL_FORM_ITEM_PLACEHOLDER" = "hiro_sato@example.com"; "PASSWORD_FORM_ITEM_TITLE" = "パスワード"; "PASSWORD_FORM_ITEM_PLACEHOLDER" = "パスワードを入力"; "CONFIRM_PASSWORD_FORM_ITEM_TITLE" = "確認"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "入力できるのは数字のみです。"; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "パスコード入力の進行状況インジケータ"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@/%@桁を入力しました"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "パスコードをお忘れですか?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "キーチェーン項目を追加できませんでした。"; @@ -167,6 +168,11 @@ "BOOL_NO" = "いいえ"; "BOOL_YES" = "はい"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "タップで回答"; "NULL_ANSWER" = "答えを選択してください"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "後で使用するために保存"; "BUTTON_OPTION_DISCARD" = "結果を破棄"; "BUTTON_OPTION_STOP_TASK" = "タスクを終了"; +"BUTTON_SAVE" = "保存"; +"BUTTON_CLEAR_ANSWER" = "答えを消去"; +"BUTTON_READ_ONLY_MODE" = "この答えは変更できません。"; /* General active tasks. */ "COUNTDOWN_LABEL" = "アクティビティ開始まで"; "TASK_COMPLETE_TITLE" = "アクティビティ完了"; "TASK_COMPLETE_TEXT" = "データは分析され、結果の準備ができると通知されます。"; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "残り%@秒です。"; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "イメージを取り込む"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "取り込んだイメージの出力ディレクトリが指定されていません。"; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "取り込んだイメージを保存できませんでした。"; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "録画を開始"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "録画を停止"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "再度ビデオを取り込む"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "体力"; "FITNESS_DISTANCE_TITLE_FORMAT" = "距離(%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "後ろを向いて、元の場所まで歩いて戻ってください。"; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "まっすぐに%ld歩まで歩いてください。"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "安全にまっすぐ行ったり来たり歩ける場所を見つけてください。進路の終わりまで来たら、コーンを回るように折り返して歩き続けます。\n\n次に、完全な円を描いて回るように指示されます。その後、両腕を脇につけ、足を肩幅くらいに開いてじっと立ってください。"; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "開始の準備ができたら、“開始”をタップしてください。\n次に、電話をポケットまたはバッグに入れて、音声による指示に従ってください。"; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "まっすぐ行ったり来たりして%@間歩きます。いつもと同じように歩いてください。"; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "完全な円を描いて歩いてから、%@間じっと立ってください。"; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "アクティビティが完了しました。"; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "タップの速度"; +"TAPPING_TASK_TITLE_RIGHT" = "右手"; +"TAPPING_TASK_TITLE_LEFT" = "左手"; "TAPPING_INTRO_TEXT" = "このアクティビティでは、タップの速度を測定します。"; -"TAPPING_INTRO_TEXT_2_FORMAT" = "電話を平らな場所に置いてください。画面に2つのボタンが%@間表示されます。同じ手の2本の指を使って、これらのボタンをできるだけ速く、交互にタップしてください。"; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "電話を平らな面に置いてください。"; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "同じ手の2本の指を使って、画面上のボタンを交互にタップします。"; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "右手の2本の指を使って、画面上のボタンを交互にタップしてください。"; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "左手の2本の指を使って、画面上のボタンを交互にタップしてください。"; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "次に、右手で同じテストを繰り返します。"; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "次に、左手で同じテストを繰り返します。"; +"TAPPING_INTRO_TEXT_2_FORMAT" = "一方の指でタップしてから、他方の指でタップします。できるだけ一定の時間間隔でタップしてください。%@間タップし続けます。"; "TAPPING_CALL_TO_ACTION" = "始めるには、“開始”をタップしてください。"; +"TAPPING_CALL_TO_ACTION_NEXT" = "始めるには、“次へ”をタップしてください。"; "TAP_BUTTON_TITLE" = "タップ"; "TOTAL_TAPS_LABEL" = "合計タップ回数"; -"TAPPING_INSTRUCTION" = "2本の指を使ってできるだけ速くボタンをタップしてください。"; - +"TAPPING_INSTRUCTION" = "2本の指を使って、できるだけ一定の速度でボタンをタップしてください。"; +"TAPPING_INSTRUCTION_RIGHT" = "右手を使ってボタンをタップしてください。"; +"TAPPING_INSTRUCTION_LEFT" = "左手を使ってボタンをタップしてください。"; +"TAPPING_SKIP_TITLE" = "この手をスキップ"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "声"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "このアクティビティでは、電話の下部にあるマイクで録音することで、あなたの声を評価します。"; "AUDIO_TOO_LOUD_LABEL" = "大きすぎる"; "AUDIO_GENERIC_ERROR_LABEL" = "声を録音できません"; +"AUDIO_LEVEL_CHECK_LABEL" = "背景ノイズのレベルを確認中です。しばらくお待ちください。"; +"AUDIO_TOO_LOUD_MESSAGE" = "周囲のノイズが大きすぎるため、声を録音できません。静かな場所に移動してやり直してください。"; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "準備ができたら“次へ”をタップしてください。"; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "聴力検査"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "2本の指で円をつまんでください。"; "HOLE_PEG_TEST_TEXT_2" = "指で円を持ち上げて移動させ落としてください。"; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "震え測定アクティビティ"; +"TREMOR_TEST_INTRO_1_DETAIL" = "このアクティビティでは、さまざまな位置で手の震えを測定します。このアクティビティが終わるまで楽な姿勢で座っていられる場所を見つけてください。"; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "下の図のように、震えの大きい方の手で電話を持ってください。"; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "下の図のように、右手で電話を持ってください。"; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "下の図のように、左手で電話を持ってください。"; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "電話を手に持って座ったまま、%@を行うように求められます。"; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "1つのタスク"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "2つのタスク"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "3つのタスク"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "4つのタスク"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "5つのタスク"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "続けるには、“次へ”をタップします。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "電話を膝の上で持つ準備をしてください。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "左手を使って電話を膝の上で持つ準備をしてください。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "右手を使って電話を膝の上で持つ準備をしてください。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "電話を膝の上で%ld秒間持ち続けてください。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "次に、手を伸ばして電話を肩の高さに持ってください。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "次に、左手を伸ばして電話を肩の高さに持ってください。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "次に、右手を伸ばして電話を肩の高さに持ってください。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "手を伸ばして、%ld秒間電話を持ち続けてください。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "肘を曲げて、電話を肩の高さに持ってください。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "肘を曲げて、電話を左手で肩の高さに持ってください。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "肘を曲げて、電話を右手で肩の高さに持ってください。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "肘を曲げて%ld秒間電話を持ち続けてください。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "次に、肘を曲げて電話で繰り返し鼻に触れてください。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "次に、電話を左手に持って肘を曲げたまま、電話で繰り返し鼻に触れてください。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "次に、電話を右手に持って肘を曲げたまま、電話で繰り返し鼻に触れてください。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "電話で%ld秒間鼻に触れ続けてください。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "手首を回すように手を振る準備をしてください。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "電話を左手に持って手首を回すように手を振る準備をしてください。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "電話を右手に持って手首を回すように手を振る準備をしてください。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "%ld秒間、手を振り続けてください。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "電話を左手に持ち替えて、次のタスクに進んでください。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "電話を右手に持ち替えて、次のタスクに進んでください。"; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "次のタスクに進んでください。"; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "アクティビティが完了しました。"; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "最初に一方の手、次に他方の手で電話を持って座ったまま、%@を行うように求められます。"; +"TREMOR_SKIP_LEFT_HAND" = "左手ではこのアクティビティができません。"; +"TREMOR_SKIP_RIGHT_HAND" = "右手ではこのアクティビティができません。"; +"TREMOR_SKIP_NEITHER" = "どちらの手でもこのアクティビティができます。"; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "ファイルを作成できませんでした"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "しきい値に達するのに十分なログファイルを削除できませんでした"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "プレビューを取り込む"; "AX_IMAGE_CAPTURED_LABEL" = "取り込んだイメージ"; +"AX_VIDEO_CAPTURE_LABEL" = "ビデオ取り込みのプレビュー"; +"AX_VIDEO_CAPTURED_LABEL" = "取り込んだビデオ"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "サイズ%@の円盤をサイズ%@の円盤の上に置くことはできません"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "ターゲット"; "AX_TOWER_OF_HANOI_TOWER" = "塔"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "%@のサイズの円盤があります"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "空"; -"AX_GRAPH_RANGE_FORMAT" = "範囲%@〜%@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "範囲%@〜%@"; +"AX_GRAPH_STACK_PREFIX" = "次の内容のスタック:"; "AX_GRAPH_AND_SEPARATOR" = "と"; "AX_GRAPH_POINT_%@" = "ポイント: %@"; diff --git a/ResearchKit/Localized/ja.lproj/locversion.plist b/ResearchKit/Localized/ja.lproj/locversion.plist index ed91efea..e2c3f140 100644 --- a/ResearchKit/Localized/ja.lproj/locversion.plist +++ b/ResearchKit/Localized/ja.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ja LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/ko.lproj/ResearchKit.strings b/ResearchKit/Localized/ko.lproj/ResearchKit.strings index e0bd30f8..faf0bc13 100644 --- a/ResearchKit/Localized/ko.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ko.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "숫자만 허용됩니다."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "암호 입력 진행 과정 표시기"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%2$@개 중 %1$@개의 숫자가 입력됨"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "암호를 잊어버렸습니까?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "키체인 항목을 추가할 수 없습니다."; @@ -167,6 +168,11 @@ "BOOL_NO" = "아니요"; "BOOL_YES" = "예"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "탭하여 대답하기"; "NULL_ANSWER" = "대답 선택하기"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "나중을 위해 저장"; "BUTTON_OPTION_DISCARD" = "결과 삭제"; "BUTTON_OPTION_STOP_TASK" = "과제 종료"; +"BUTTON_SAVE" = "저장"; +"BUTTON_CLEAR_ANSWER" = "대답 지우기"; +"BUTTON_READ_ONLY_MODE" = "이 대답을 수정할 수 없습니다."; /* General active tasks. */ "COUNTDOWN_LABEL" = "실험 시작까지"; "TASK_COMPLETE_TITLE" = "실험 완료"; "TASK_COMPLETE_TEXT" = "데이터를 분석하여 결과가 준비되면 통보합니다."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@초 남았습니다."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "이미지 캡처"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "캡처한 이미지를 위한 출력 디렉토리가 지정되지 않았습니다."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "캡처한 이미지를 저장할 수 없습니다."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "녹화 시작"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "녹화 중단"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "비디오 다시 캡처"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "피트니스"; "FITNESS_DISTANCE_TITLE_FORMAT" = "거리(%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "뒤로 돌아서 시작한 지점으로 되돌아가십시오."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "일직선으로 최대 %ld보를 걸으십시오."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "일직선으로 안전하게 왔다 갔다 할 수 있는 공간을 찾으십시오. 계속 걷다가 반환점에서 마치 원뿔형 도로 표지가 있는 것처럼 주변을 돌아서 되돌아갑니다.\n\n그런 다음, 원을 그리며 돌아서서 양팔을 옆구리에 대고 발은 어깨너비만큼 벌린 채 서 있으십시오."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "시작할 준비가 되면 시작하기를 탭하십시오.\n그런 다음 전화기를 주머니나 가방에 넣고 오디오 지침을 따르십시오."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "%@ 동안 일직선으로 왔다 갔다 걸으십시오. 평상시 걷는 것처럼 걸으면 됩니다."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "원을 그리며 돌아선 다음 %@ 동안 가만히 서 있으십시오."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "이 실험을 완료했습니다."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "탭하기 속도"; +"TAPPING_TASK_TITLE_RIGHT" = "오른손"; +"TAPPING_TASK_TITLE_LEFT" = "왼손"; "TAPPING_INTRO_TEXT" = "이 실험은 사용자의 탭하기 속도를 측정합니다."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "전화를 평편한 바닥에 놓으십시오. 화면에 두 개의 버튼이 %@ 동안 나타납니다. 이 버튼을 같은 쪽 손의 두 손가락을 사용하여 최대한 빨리 교대로 탭하십시오."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "전화기를 평평한 표면에 두십시오."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "동일한 손의 두 손가락으로 화면의 버튼을 번갈아 탭하십시오."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "오른손의 두 손가락으로 화면의 버튼을 번갈아 탭하십시오."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "왼손의 두 손가락으로 화면의 버튼을 번갈아 탭하십시오."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "이제 오른손으로 동일한 테스트를 반복하십시오."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "이제 왼손으로 동일한 테스트를 반복하십시오."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "한 손가락을 탭하고 다른 손가락을 탭하십시오. 탭 간격이 거의 없도록 연속으로 탭하십시오. %@를 계속 탭하십시오."; "TAPPING_CALL_TO_ACTION" = "시작하려면 시작하기를 탭하십시오."; +"TAPPING_CALL_TO_ACTION_NEXT" = "시작하려면 다음을 탭하십시오."; "TAP_BUTTON_TITLE" = "탭"; "TOTAL_TAPS_LABEL" = "탭한 총 횟수"; -"TAPPING_INSTRUCTION" = "두 손가락으로 최대한 빨리 버튼을 탭하십시오."; - +"TAPPING_INSTRUCTION" = "두 손가락으로 버튼을 빠르게 연속으로 탭하십시오."; +"TAPPING_INSTRUCTION_RIGHT" = "오른손으로 버튼을 탭하십시오."; +"TAPPING_INSTRUCTION_LEFT" = "왼손으로 버튼을 탭하십시오."; +"TAPPING_SKIP_TITLE" = "이 손 건너뛰기"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "음성"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "이 실험은 전화 하단에 있는 마이크로 목소리를 녹음하여 사용자의 음성을 평가합니다."; "AUDIO_TOO_LOUD_LABEL" = "소리가 너무 큼"; "AUDIO_GENERIC_ERROR_LABEL" = "오디오를 녹음할 수 없습니다."; +"AUDIO_LEVEL_CHECK_LABEL" = "주변 소음 단계를 측정하는 동안 기다리십시오."; +"AUDIO_TOO_LOUD_MESSAGE" = "음성을 녹음하기에 주변 소음이 너무 큽니다. 좀 더 조용한 장소로 이동한 다음 다시 시도하십시오."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "준비되면 다음을 탭하십시오."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "순음 청력 검사"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "두 손가락을 사용하여 페그를 집으십시오."; "HOLE_PEG_TEST_TEXT_2" = "손가락을 떼어서 페그를 내려놓으십시오."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "손떨림 실험"; +"TREMOR_TEST_INTRO_1_DETAIL" = "이 실험은 여러 가지 상황에서 손떨림 정도를 측정합니다. 이 실험을 위해 편안하게 앉아있을 수 있는 장소로 이동하십시오."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "아래 그림처럼 전화기를 더 자주 사용하는 손에 들고 있으십시오."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "아래 그림처럼 전화기를 오른손에 들고 있으십시오."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "아래 그림처럼 전화기를 왼손에 들고 있으십시오."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "전화를 손에 든 채로 앉아있는 동안 %@를 수행해야 합니다."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "한 건의 과제"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "두 건의 과제"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "세 건의 과제"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "네 건의 과제"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "다섯 건의 과제"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "다음을 탭하여 계속합니다."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "전화기를 무릎에 두는 동작을 준비하십시오."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "왼손으로 전화기를 쥐고 무릎에 두는 동작을 준비하십시오."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "오른손으로 전화기를 쥐고 무릎에 두는 동작을 준비하십시오."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "전화기를 %ld초 동안 무릎에 두십시오."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "이제 전화기를 어깨 높이로 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "이제 전화기를 왼손에 어깨 높이로 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "이제 전화기를 오른손에 어깨 높이로 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "%ld초 동안 손을 내민 채로 전화기를 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "이제 팔꿈치를 굽히고 전화기를 어깨 높이에 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "이제 왼쪽 팔꿈치를 굽히고 왼손으로 전화기를 어깨 높이에 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "이제 오른쪽 팔꿈치를 굽히고 오른손으로 전화기를 어깨 높이에 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "%ld초 동안 팔꿈치를 굽힌 채로 전화기를 들고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "이제 팔꿈치를 굽히고 전화기를 코에 반복적으로 대십시오."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "이제 왼쪽 팔꿈치를 굽히고 왼손으로 전화기를 든 다음 전화기를 코에 반복적으로 대십시오."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "이제 오른쪽 팔꿈치를 굽히고 오른손으로 전화기를 든 다음 전화기를 코에 반복적으로 대십시오."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "전화기를 %ld초 동안 코에 대고 있으십시오."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "반짝반짝 율동을 취할 준비를 하십시오."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "왼손으로 전화기를 들고 반짝반짝 율동을 취할 준비를 하십시오."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "오른손으로 전화기를 들고 반짝반짝 율동을 취할 준비를 하십시오."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "%ld초 동안 반짝반짝 율동을 수행하십시오."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "이제 전화기를 왼손으로 바꿔 들고 다음 과제를 진행하십시오."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "이제 전화기를 오른손으로 바꿔 들고 다음 과제를 진행하십시오."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "다음 과제를 진행합니다."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "실험이 완료되었습니다."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "전화를 한 손에 먼저 들었다가 다른 손으로 들면서 %@를 수행해야 합니다."; +"TREMOR_SKIP_LEFT_HAND" = "저는 이 과제를 왼손으로 수행할 수 없습니다."; +"TREMOR_SKIP_RIGHT_HAND" = "저는 이 과제를 오른손으로 수행할 수 없습니다."; +"TREMOR_SKIP_NEITHER" = "저는 이 과제를 양손으로 수행할 수 있습니다."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "파일을 생성할 수 없습니다."; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "임계값에 이르기 위한 충분한 수의 로그 파일을 제거하는 데 실패했습니다."; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "캡처 미리보기"; "AX_IMAGE_CAPTURED_LABEL" = "캡처된 이미지"; +"AX_VIDEO_CAPTURE_LABEL" = "비디오 캡처 미리보기"; +"AX_VIDEO_CAPTURED_LABEL" = "캡처된 비디오"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "크기가 %@인 디스크를 크기가 %@인 디스크 위에 놓을 수 없습니다."; "AX_TOWER_OF_HANOI_TARGET_DISK" = "대상"; "AX_TOWER_OF_HANOI_TOWER" = "탑"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "%@ 크기의 디스크가 있음"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "비어 있음"; -"AX_GRAPH_RANGE_FORMAT" = "%@에서 %@까지의 범위"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "%@에서 %@까지의 범위"; +"AX_GRAPH_STACK_PREFIX" = "다음으로 구성된 스택"; "AX_GRAPH_AND_SEPARATOR" = " 및 "; "AX_GRAPH_POINT_%@" = "포인트: %@"; diff --git a/ResearchKit/Localized/ko.lproj/locversion.plist b/ResearchKit/Localized/ko.lproj/locversion.plist index e2e07429..c27c24c4 100644 --- a/ResearchKit/Localized/ko.lproj/locversion.plist +++ b/ResearchKit/Localized/ko.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ko LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/ms.lproj/ResearchKit.strings b/ResearchKit/Localized/ms.lproj/ResearchKit.strings index 2b53e8c1..48370f83 100644 --- a/ResearchKit/Localized/ms.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ms.lproj/ResearchKit.strings @@ -53,21 +53,21 @@ "CONSENT_LEARN_MORE_TITLE" = "Ketahui Lebih Lanjut"; /* Consent section learn more */ -"LEARN_MORE_DATA_GATHERING" = "Ketahui lebih lanjut mengenai cara data dikumpulkan"; -"LEARN_MORE_DATA_USE" = "Ketahui lebih lanjut mengenai cara data digunakan"; -"LEARN_MORE_PRIVACY" = "Ketahui lebih lanjut mengenai cara privasi dan identiti anda dilindungi"; -"LEARN_MORE_WELCOME" = "Ketahui lebih lanjut mengenai kajian terlebih dahulu"; -"LEARN_MORE_STUDY_SURVEY" = "Ketahui lebih lanjut mengenai tinjauan kajian"; -"LEARN_MORE_TIME_COMMITMENT" = "Ketahui lebih lanjut mengenai impak kajian pada masa anda"; -"LEARN_MORE_TASKS" = "Ketahui lebih lanjut mengenai tugas yang terlibat"; -"LEARN_MORE_WITHDRAWING" = "Ketahui lebih lanjut mengenai menarik diri"; +"LEARN_MORE_DATA_GATHERING" = "Ketahui lebih lanjut tentang cara data dikumpulkan"; +"LEARN_MORE_DATA_USE" = "Ketahui lebih lanjut tentang cara data digunakan"; +"LEARN_MORE_PRIVACY" = "Ketahui lebih lanjut tentang cara privasi dan identiti anda dilindungi"; +"LEARN_MORE_WELCOME" = "Ketahui lebih lanjut tentang kajian terlebih dahulu"; +"LEARN_MORE_STUDY_SURVEY" = "Ketahui lebih lanjut tentang tinjauan kajian"; +"LEARN_MORE_TIME_COMMITMENT" = "Ketahui lebih lanjut tentang impak kajian pada masa anda"; +"LEARN_MORE_TASKS" = "Ketahui lebih lanjut tentang tugas yang terlibat"; +"LEARN_MORE_WITHDRAWING" = "Ketahui lebih lanjut tentang menarik diri"; /* Consent sharing step */ "CONSENT_SHARING_TITLE" = "Pilihan Perkongsian"; "CONSENT_SHARE_WIDELY_%@" = "Kongsi data saya dengan %@ dan penyelidik yang layak di seluruh dunia"; "CONSENT_SHARE_ONLY_%@" = "Kongsi data saya dengan %@ sahaja"; "CONSENT_SHARING_DESCRIPTION_%@" = "%@ akan menerima data kajian anda daripada penyertaan anda dalam kajian ini.\n\nBerkongsi data kajian berkod anda dengan lebih luas (tanpa maklumat seperti nama anda) mungkin memberi manfaat kepada penyelidikan ini dan penyelidikan masa hadapan."; -"LEARN_MORE_CONSENT_SHARING" = "Ketahui lebih lanjut mengenai perkongsian data"; +"LEARN_MORE_CONSENT_SHARING" = "Ketahui lebih lanjut tentang perkongsian data"; /* Lines beneath typewritten signatures on documents. Argument is the title of the signatory, e.g. "Participant's Signature" */ "CONSENT_DOC_LINE_PRINTED_NAME" = "Nama %@ (bertulis)"; @@ -89,9 +89,9 @@ /* Alerts for invalid location coordinates */ "LOCATION_QUESTION_PLACEHOLDER" = "Masukkan alamat"; "LOCATION_ERROR_TITLE" = "Tidak Menemui Alamat yang Ditentukan"; -"LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "Tidak dapat menyelesaikan lokasi semasa anda. Sila taipkan alamat atau pergi ke lokasi dengan isyarat GPS yang lebih baik jika berkenaan."; +"LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "Gagal menyelesaikan lokasi semasa anda. Sila taipkan alamat atau pergi ke lokasi dengan isyarat GPS yang lebih baik jika berkenaan."; "LOCATION_ERROR_MESSAGE_DENIED" = "Akses kepada perkhidmatan lokasi telah ditolak. Sila berikan aplikasi ini kebenaran untuk menggunakan perkhidmatan lokasi menerusi Seting."; -"LOCATION_ERROR_GEOCODE" = "Tidak dapat mencari hasil untuk alamat yang dimasukkan. Sila pastikan alamat adalah sah."; +"LOCATION_ERROR_GEOCODE" = "Gagal mencari hasil untuk alamat yang dimasukkan. Sila pastikan alamat adalah sah."; "LOCATION_ERROR_GEOCODE_NETWORK" = "Sama ada anda tidak disambungkan ke internet atau anda telah melebihi bilangan maksimum permintaan carian alamat. Jika anda tidak disambungkan ke internet, sila aktifkan Wi-Fi anda untuk menjawab soalan ini, langkau soalan ini jika butang langkau tersedia, atau kembali ke tinjauan apabila anda disambungkan ke internet. Sebaliknya, sila cuba lagi dalam masa beberapa minit."; /* Alert for exceeding length limit in text answer */ @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Hanya aksara angka dibenarkan."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Penunjuk kemajuan entri kod laluan"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ daripada %@ digit dimasukkan"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Terlupa Kod Laluan?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Tidak dapat menambah item Rantai Kunci."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Tidak"; "BOOL_YES" = "Ya"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ka"; +"MEASURING_UNIT_IN" = "inci"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Ketik untuk jawab"; "NULL_ANSWER" = "Pilih jawapan"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Simpan untuk Kemudian"; "BUTTON_OPTION_DISCARD" = "Buang Hasil"; "BUTTON_OPTION_STOP_TASK" = "Tamatkan Tugas"; +"BUTTON_SAVE" = "Simpan"; +"BUTTON_CLEAR_ANSWER" = "Kosongkan jawapan"; +"BUTTON_READ_ONLY_MODE" = "Jawapan ini tidak boleh diubah suai."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Memulakan aktiviti dalam"; "TASK_COMPLETE_TITLE" = "Aktiviti Selesai"; "TASK_COMPLETE_TEXT" = "Data anda akan dianalisis dan anda akan dimaklumkan apabila keputusan anda tersedia."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Tinggal %@ saat."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Tangkap Imej"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Tiada direktori output ditentukan untuk imej yang ditangkap."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Imej yang ditangkap tidak dapat disimpan."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Mula Merakam"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Henti Merakam"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Rakam Semula Video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kecergasan"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Jarak (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Pusing dan berjalan balik ke tempat anda bermula."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Jalan sehingga %ld langkah dalam garis lurus."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Cari tempat di mana anda boleh berjalan mundar mandir dalam garis lurus. Cuba berjalan berterusan dengan berpusing di kedua penghujung laluan anda, seperti anda berjalan mengelilingi kon.\n\nSeterusnya anda akan diarahkan untuk berpusing dalam bulatan penuh, kemudian berdiri tegak dengan tangan anda di sisi anda dan kaki anda dibuka selebar bahu."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Ketik Mulakan apabila anda bersedia untuk bermula.\nKemudian letakkan telefon anda di dalam saku atau beg dan ikuti arahan audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Berjalan mundar mandir dalam garis lurus selama %@. Jalan seperti biasa anda lakukan."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Buat pusingan penuh dan kemudian berdiri tegak selama %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Anda telah melengkapkan aktiviti."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Kelajuan Ketikan"; +"TAPPING_TASK_TITLE_RIGHT" = "Tangan Kanan"; +"TAPPING_TASK_TITLE_LEFT" = "Tangan Kiri"; "TAPPING_INTRO_TEXT" = "Aktiviti ini mengukur kelajuan mengetik anda."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Letakkan telefon anda pada permukaan rata. Dua butang akan muncul pada skrin anda selama %@. Menggunakan dua jari pada tangan yang sama, ketik butang berselang seli dengan kedua-dua jari secepat yang anda boleh."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Letakkan telefon anda di atas permukaan rata."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Gunakan dua jari pada tangan yang sama untuk mengetik butang pada skrin secara berselang-seli."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Gunakan dua jari pada tangan kanan anda untuk mengetik butang pada skrin secara berselang-seli."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Gunakan dua jari pada tangan kiri anda untuk mengetik butang pada skrin secara berselang-seli."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Sekarang ulang ujian yang sama menggunakan tangan kanan anda."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Sekarang ulang ujian yang sama menggunakan tangan kiri anda."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Ketik satu jari, kemudian ketik yang lain. Cuba mengetik dengan kadar yang sekata mungkin. Teruskan mengetik selama %@."; "TAPPING_CALL_TO_ACTION" = "Ketik Mulakan untuk memulakan."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Ketik Seterusnya untuk bermula."; "TAP_BUTTON_TITLE" = "Ketik"; "TOTAL_TAPS_LABEL" = "Jumlah Ketikan"; -"TAPPING_INSTRUCTION" = "Ketik butang secepat yang anda boleh menggunakan dua jari."; - +"TAPPING_INSTRUCTION" = "Ketik butang sekonsisten yang anda boleh menggunakan dua jari."; +"TAPPING_INSTRUCTION_RIGHT" = "Ketik butang menggunakan tangan KANAN anda."; +"TAPPING_INSTRUCTION_LEFT" = "Ketik butang menggunakan tangan KIRI anda."; +"TAPPING_SKIP_TITLE" = "Langkau tangan ini"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Suara"; @@ -240,7 +272,10 @@ "AUDIO_INTRO_TEXT" = "Tarik nafas panjang dan sebut “Aaaaah” ke dalam mikrofon selama yang anda boleh. Kekalkan kelantangan suara yang tetap agar bar audio kekal biru."; "AUDIO_INTENDED_USE" = "Aktiviti ini menilai suara anda dengan merakamnya menggunakan mikrofon di bahagian bawah telefon anda."; "AUDIO_TOO_LOUD_LABEL" = "Terlalu Kuat"; -"AUDIO_GENERIC_ERROR_LABEL" = "Tidak dapat merakam audio"; +"AUDIO_GENERIC_ERROR_LABEL" = "Gagal merakam audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Sila tunggu sementara kami memeriksa aras hingar latar belakang."; +"AUDIO_TOO_LOUD_MESSAGE" = "Aras hingar ambien terlalu bising untuk merakamkan suara anda. Sila pergi ke tempat yang lebih senyap dan cuba lagi."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Ketik Seterusnya apabila bersedia."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometri Nada"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Kutip pancang menggunakan dua jari."; "HOLE_PEG_TEST_TEXT_2" = "Angkat jari untuk menjatuhkan pancang."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Aktiviti Getaran"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Aktiviti ini mengukur getaran tangan anda dalam pelbagai posisi. Cari tempat di mana anda boleh duduk dengan selesa sepanjang tempoh aktiviti ini."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Pegang telefon di tangan anda yang lebih terjejas seperti yang ditunjukkan dalam imej di bawah."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Pegang telefon di tangan KANAN anda seperti yang ditunjukkan dalam imej di bawah."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Pegang telefon di tangan KIRI anda seperti yang ditunjukkan dalam imej di bawah."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Anda akan diminta untuk melakukan %@ sementara duduk dengan telefon di tangan anda."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "satu tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dua tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tiga tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "empat tugas"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "lima tugas"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Ketik seterusnya untuk teruskan."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Bersedia untuk memegang telefon anda di riba anda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Bersedia untuk memegang telefon anda di riba anda dengan tangan KIRI anda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Bersedia untuk memegang telefon anda di riba anda dengan tangan KANAN anda."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Teruskan memegang telefon anda di riba anda selama %ld saat."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Sekarang pegang telefon anda dengan tangan anda diluruskan pada ketinggian bahu."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Sekarang pegang telefon anda dengan tangan KIRI anda diluruskan pada ketinggian bahu."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Sekarang pegang telefon anda dengan tangan KANAN anda diluruskan pada ketinggian bahu."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Teruskan memegang telefon anda dengan tangan anda diluruskan selama %ld saat."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Sekarang pegang telefon anda pada ketinggian bahu dengan siku anda dibengkokkan."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Sekarang pegang telefon anda dengan tangan KIRI anda pada ketinggian bahu dengan siku anda dibengkokkan."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Sekarang pegang telefon anda dengan tangan KANAN anda pada ketinggian bahu dengan siku anda dibengkokkan."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Teruskan memegang telefon anda dengan siku anda dibengkokkan selama %ld saat"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Terus bengkokkan siku anda, sentuh telefon anda ke hidung anda berulang kali."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Terus bengkokkan siku anda dengan telefon anda di tangan KIRI anda, sentuh telefon anda ke hidung anda berulang kali."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Terus bengkokkan siku anda dengan telefon anda di tangan KANAN anda, sentuh telefon anda ke hidung anda berulang kali."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Teruskan menyentuh telefon anda ke hidung anda selama %ld saat"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Bersedia untuk melakukan lambaian ratu (lambai dengan memusingkan pergelangan tangan anda)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Bersedia untuk melakukan lambaian ratu dengan telefon anda di tangan KIRI anda (lambai dengan memusingkan pergelangan tangan anda)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Bersedia untuk melakukan lambaian ratu dengan telefon anda di tangan KANAN anda (lambai dengan memusingkan pergelangan tangan anda)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Terus melakukan lambaian ratu untuk %ld saat."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Sekarang tukar telefon ke tangan KIRI anda dan teruskan ke tugas seterusnya."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Sekarang tukar telefon ke tangan KANAN anda dan teruskan ke tugas seterusnya."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Teruskan ke tugas seterusnya."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktiviti selesai."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Anda akan diminta untuk melakukan %@ sementara duduk dengan telefon di sebelah tangan dahulu, kemudian sekali lagi dengan tangan yang lain."; +"TREMOR_SKIP_LEFT_HAND" = "Saya tidak boleh laksanakan aktiviti ini menggunakan tangan KIRI saya."; +"TREMOR_SKIP_RIGHT_HAND" = "Saya tidak boleh laksanakan aktiviti ini menggunakan tangan KANAN saya."; +"TREMOR_SKIP_NEITHER" = "Saya boleh laksanakan aktiviti ini menggunakan kedua belah tangan."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Tidak dapat mencipta fail"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Tidak dapat mengeluarkan fail log yang mencukupi untuk mencapai nilai ambang"; @@ -378,7 +455,10 @@ "AX_IMAGE_CAPTURE_LABEL" = "Pratonton tangkapan"; "AX_IMAGE_CAPTURED_LABEL" = "Imej ditangkap"; -"AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Tidak dapat menempatkan cakera bersaiz %@ pada cakera bersaiz %@"; +"AX_VIDEO_CAPTURE_LABEL" = "Pratonton rakaman video"; +"AX_VIDEO_CAPTURED_LABEL" = "Video dirakam"; + +"AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Gagal menempatkan cakera bersaiz %@ pada cakera bersaiz %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Sasaran"; "AX_TOWER_OF_HANOI_TOWER" = "Menara"; "AX_TOWER_OF_HANOI_PLACE_DISK" = "Dwiketik untuk menempatkan cakera"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Mempunyai cakera bersaiz %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Kosong"; -"AX_GRAPH_RANGE_FORMAT" = "Julat daripada %@ hingga %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Julat daripada %@ hingga %@"; +"AX_GRAPH_STACK_PREFIX" = "Tindanan terdiri daripada"; "AX_GRAPH_AND_SEPARATOR" = " dan "; "AX_GRAPH_POINT_%@" = "Titik: %@"; diff --git a/ResearchKit/Localized/ms.lproj/locversion.plist b/ResearchKit/Localized/ms.lproj/locversion.plist index 4016f86b..18d9010c 100644 --- a/ResearchKit/Localized/ms.lproj/locversion.plist +++ b/ResearchKit/Localized/ms.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ms LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/nl.lproj/ResearchKit.strings b/ResearchKit/Localized/nl.lproj/ResearchKit.strings index 4766345a..7015f9d6 100644 --- a/ResearchKit/Localized/nl.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/nl.lproj/ResearchKit.strings @@ -34,11 +34,11 @@ "CONSENT_NAME_FAMILY" = "Achternaam"; "CONSENT_NAME_PLACEHOLDER" = "Vereist"; "CONSENT_REVIEW_TITLE" = "Bekijk"; -"CONSENT_REVIEW_INSTRUCTION" = "Lees het formulier hieronder door en tik op 'Akkoord' als u gereed bent om verder te gaan."; +"CONSENT_REVIEW_INSTRUCTION" = "Lees het formulier hieronder door en tik op 'Akkoord' als je gereed bent om verder te gaan."; "CONSENT_REVIEW_ALERT_TITLE" = "Bekijk"; "CONSENT_SIGNATURE_TITLE" = "Handtekening"; -"CONSENT_SIGNATURE_INSTRUCTION" = "Onderteken met uw vinger op de onderstaande lijn."; -"CONSENT_SIGNATURE_PLACEHOLDER" = "Zet hier uw handtekening"; +"CONSENT_SIGNATURE_INSTRUCTION" = "Onderteken met je vinger op de onderstaande lijn."; +"CONSENT_SIGNATURE_PLACEHOLDER" = "Zet hier je handtekening"; "CONSENT_PAGE_NUMBER_FORMAT" = "Pagina %1$ld van %2$ld"; /* Consent section titles. */ @@ -55,18 +55,18 @@ /* Consent section learn more */ "LEARN_MORE_DATA_GATHERING" = "Meer informatie over het verzamelen van gegevens"; "LEARN_MORE_DATA_USE" = "Meer informatie over het gebruik van gegevens"; -"LEARN_MORE_PRIVACY" = "Meer informatie over de bescherming van uw privacy en identiteit"; +"LEARN_MORE_PRIVACY" = "Meer informatie over de bescherming van je privacy en identiteit"; "LEARN_MORE_WELCOME" = "Meer informatie over het onderzoek"; "LEARN_MORE_STUDY_SURVEY" = "Meer informatie over de onderzoeksenquête"; "LEARN_MORE_TIME_COMMITMENT" = "Meer informatie over hoe lang het onderzoek duurt"; -"LEARN_MORE_TASKS" = "Meer informatie over wat u moet doen"; +"LEARN_MORE_TASKS" = "Meer informatie over wat je moet doen"; "LEARN_MORE_WITHDRAWING" = "Meer informatie over afzien van deelname"; /* Consent sharing step */ "CONSENT_SHARING_TITLE" = "Opties voor delen"; "CONSENT_SHARE_WIDELY_%@" = "Deel mijn gegevens met %@ en gekwalificeerde onderzoekers wereldwijd"; "CONSENT_SHARE_ONLY_%@" = "Deel mijn gegevens alleen met %@"; -"CONSENT_SHARING_DESCRIPTION_%@" = "De resultaten van uw deelname aan dit onderzoek worden naar %@ gestuurd.\n\nDoor de gecodeerde onderzoeksgegevens met anderen te delen (zonder persoonlijke gegevens zoals uw naam) kunt u helpen om dit en toekomstig onderzoek te verbeteren."; +"CONSENT_SHARING_DESCRIPTION_%@" = "De resultaten van je deelname aan dit onderzoek worden naar %@ gestuurd.\n\nDoor de gecodeerde onderzoeksgegevens met anderen te delen (zonder persoonlijke gegevens zoals je naam) kun je helpen om dit en toekomstig onderzoek te verbeteren."; "LEARN_MORE_CONSENT_SHARING" = "Meer informatie over het delen van gegevens"; /* Lines beneath typewritten signatures on documents. Argument is the title of the signatory, e.g. "Participant's Signature" */ @@ -91,8 +91,8 @@ "LOCATION_ERROR_TITLE" = "Opgegeven adres niet gevonden"; "LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "De huidige locatie kan niet worden bepaald. Typ een adres of ga indien nodig naar een plek met een beter GPS-signaal."; "LOCATION_ERROR_MESSAGE_DENIED" = "Toegang tot 'Locatievoorzieningen' is geweigerd. Ga naar Instellingen en geef deze app toestemming om 'Locatievoorzieningen' te gebruiken."; -"LOCATION_ERROR_GEOCODE" = "Het ingevoerde adres is niet gevonden. Zorg dat u een geldig adres invoert."; -"LOCATION_ERROR_GEOCODE_NETWORK" = "U bent niet verbonden met het internet of u hebt te vaak naar een adres gezocht. Zet om deze vraag te beantwoorden Wi‑Fi aan als u niet verbonden bent met het internet. U kunt deze vraag ook overslaan als er een knop 'Sla over' is of verdergaan met deze vragenlijst als de internetverbinding actief is. Of u kunt het over een paar minuten opnieuw proberen."; +"LOCATION_ERROR_GEOCODE" = "Het ingevoerde adres is niet gevonden. Zorg dat je een geldig adres invoert."; +"LOCATION_ERROR_GEOCODE_NETWORK" = "Je bent niet verbonden met het internet of je hebt te vaak naar een adres gezocht. Zet om deze vraag te beantwoorden Wi‑Fi aan als je niet verbonden bent met het internet. Je kunt deze vraag ook overslaan als er een knop 'Sla over' is of verdergaan met deze vragenlijst als de internetverbinding actief is. Of je kunt het over een paar minuten opnieuw proberen."; /* Alert for exceeding length limit in text answer */ "TEXT_ANSWER_EXCEEDING_MAX_LENGTH_ALERT_MESSAGE" = "Tekst overschrijdt maximale lengte: %@"; @@ -118,8 +118,8 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "Verificatie"; -"VERIFICATION_STEP_TITLE" = "Verifieer uw e-mailadres"; -"RESEND_EMAIL_LABEL_MESSAGE" = "Tik op de koppeling hieronder als u geen verificatiemail hebt ontvangen en u deze opnieuw wilt laten versturen."; +"VERIFICATION_STEP_TITLE" = "Verifieer je e-mailadres"; +"RESEND_EMAIL_LABEL_MESSAGE" = "Tik op de koppeling hieronder als je geen verificatiemail hebt ontvangen en je deze opnieuw wilt laten versturen."; "RESEND_EMAIL_BUTTON_TITLE" = "Stuur controlemail opnieuw"; /* Login step */ @@ -131,9 +131,9 @@ "PASSCODE_CONFIRM_MESSAGE" = "Herhaal toegangscode"; "PASSCODE_SAVED_MESSAGE" = "Toegangscode bewaard"; "PASSCODE_AUTHENTICATED_MESSAGE" = "Toegangscode geverifieerd"; -"PASSCODE_OLD_ENTRY_MESSAGE" = "Voer uw oude toegangscode in"; -"PASSCODE_NEW_ENTRY_MESSAGE" = "Voer uw nieuwe toegangscode in"; -"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Herhaal uw nieuwe wachtwoord"; +"PASSCODE_OLD_ENTRY_MESSAGE" = "Voer je oude toegangscode in"; +"PASSCODE_NEW_ENTRY_MESSAGE" = "Voer je nieuwe toegangscode in"; +"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Herhaal je nieuwe wachtwoord"; "PASSCODE_INVALID_ALERT_TITLE" = "Toegangscode onjuist"; "PASSCODE_INVALID_ALERT_MESSAGE" = "De codes komen niet overeen. Probeer het opnieuw."; "PASSCODE_TOUCH_ID_MESSAGE" = "Log in met Touch ID"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Alleen cijfertekens toegestaan."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Voortgangsindicator toegangscode-invoer"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ van %@ cijfers ingevoerd"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Toegangscode vergeten?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Sleutelhangeronderdeel kan niet worden toegevoegd."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nee"; "BOOL_YES" = "Ja"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "vt"; +"MEASURING_UNIT_IN" = "inch"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Tik om te antwoorden"; "NULL_ANSWER" = "Kies een antwoord"; @@ -189,72 +195,101 @@ "BUTTON_OPTION_SAVE" = "Bewaar voor later"; "BUTTON_OPTION_DISCARD" = "Wis resultaten"; "BUTTON_OPTION_STOP_TASK" = "Stop met taak"; +"BUTTON_SAVE" = "Bewaar"; +"BUTTON_CLEAR_ANSWER" = "Wis antwoord"; +"BUTTON_READ_ONLY_MODE" = "Dit antwoord kan niet worden gewijzigd."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Activiteit begint over"; "TASK_COMPLETE_TITLE" = "Activiteit voltooid"; -"TASK_COMPLETE_TEXT" = "Uw gegevens worden geanalyseerd. U ontvangt bericht als de resultaten gereed zijn."; +"TASK_COMPLETE_TEXT" = "Je gegevens worden geanalyseerd. Je ontvangt bericht als de resultaten gereed zijn."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Nog %@ seconden."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Leg afbeelding vast"; "CAPTURE_BUTTON_RECAPTURE_IMAGE" = "Leg afbeelding opnieuw vast"; "CAPTURE_ERROR_CAMERA_NOT_FOUND" = "Geen camera gevonden. Deze stap kan niet worden voltooid."; -"CAPTURE_ERROR_NO_PERMISSIONS" = "Om deze stap te voltooien, moet u in Instellingen deze app toegang tot de camera geven."; +"CAPTURE_ERROR_NO_PERMISSIONS" = "Om deze stap te voltooien, moet je in Instellingen deze app toegang tot de camera geven."; "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Er is geen uitvoermap voor vastgelegde afbeeldingen opgegeven."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "De vastgelegde afbeelding kan niet worden bewaard."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Start opname"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stop opname"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Leg video opnieuw vast"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Conditie"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Afstand (%@)"; "FITNESS_HEARTRATE_TITLE" = "Hartslag (spm)"; "FITNESS_SIT_INSTRUCTION_FORMAT" = "Ga %@ gemakkelijk zitten."; -"FITNESS_WALK_INSTRUCTION_FORMAT" = "Loop %@ zo snel als u kunt."; -"FITNESS_INTRO_TEXT_FORMAT" = "Tijdens deze activiteit wordt uw hartslag gemeten en wordt gekeken hoe ver u in %1$@ kunt lopen."; -"FITNESS_INTRO_2_TEXT_FORMAT" = "Loop buiten %1$@ zo snel als u kunt. Ga daarna gemakkelijk zitten en rust %2$@ uit. Tik op 'Start' om te beginnen."; +"FITNESS_WALK_INSTRUCTION_FORMAT" = "Loop %@ zo snel als je kunt."; +"FITNESS_INTRO_TEXT_FORMAT" = "Tijdens deze activiteit wordt je hartslag gemeten en wordt gekeken hoe ver je in %1$@ kunt lopen."; +"FITNESS_INTRO_2_TEXT_FORMAT" = "Loop buiten %1$@ zo snel als je kunt. Ga daarna gemakkelijk zitten en rust %2$@ uit. Tik op 'Start' om te beginnen."; /* Short walk active task. */ "WALK_TASK_TITLE" = "Tred en balans"; -"WALK_INTRO_TEXT" = "Tijdens deze activiteit worden uw tred en balans gemeten terwijl uw loopt en stilstaat. Ga niet verder als u niet veilig zelfstandig kunt lopen."; -"WALK_INTRO_2_TEXT_%ld" = "Zoek een plek waar u veilig en zelfstandig ongeveer %ld stappen in een rechte lijn kunt zetten."; -"WALK_INTRO_2_DETAIL" = "Stop uw iPhone in uw zak of tas en volg de audio-instructies."; +"WALK_INTRO_TEXT" = "Tijdens deze activiteit worden je tred en balans gemeten terwijl je loopt en stilstaat. Ga niet verder als je niet veilig zelfstandig kunt lopen."; +"WALK_INTRO_2_TEXT_%ld" = "Zoek een plek waar je veilig en zelfstandig ongeveer %ld stappen in een rechte lijn kunt zetten."; +"WALK_INTRO_2_DETAIL" = "Stop je iPhone in je zak of tas en volg de audio-instructies."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Sta nu %@ lang stil."; "WALK_STAND_INSTRUCTION_FORMAT" = "Sta %@ stil."; "WALK_RETURN_INSTRUCTION_FORMAT" = "Draai om en loop terug naar het beginpunt."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Zet maximaal %ld stappen in een rechte lijn."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Zoek een plek waar je veilig in een rechte lijn heen en weer kunt lopen. Maak aan de einden van de looproute een bocht (alsof je om een pylon heenloopt) zodat je niet hoeft te stoppen.\n\nDaarna wordt je gevraagd om één keer om je as te draaien en vervolgens om stil te staan met de armen langs je lichaam en je voeten uit elkaar op schouderbreedte."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tik op 'Start' als je klaar bent om te beginnen.\nStop de telefoon vervolgens in je zak of tas en volg de audio-instructies."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Loop %@ in een rechte lijn heen en weer. Loop zoals je altijd loopt."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Draai één keer om je as en sta vervolgens %@ stil."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Je hebt de activiteit voltooid."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Tiksnelheid"; -"TAPPING_INTRO_TEXT" = "Tijdens deze activiteit wordt de snelheid waarmee u tikt gemeten."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Leg uw telefoon op een vlakke ondergrond. Er verschijnen %@ lang twee knoppen op het scherm. Tik zo snel mogelijk afwisselend met twee vingers van dezelfde hand op de knoppen."; +"TAPPING_TASK_TITLE_RIGHT" = "Rechterhand"; +"TAPPING_TASK_TITLE_LEFT" = "Linkerhand"; +"TAPPING_INTRO_TEXT" = "Tijdens deze activiteit wordt de snelheid waarmee je tikt gemeten."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Plaats de telefoon op een egaal oppervlak."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Tik met twee vingers van dezelfde hand beurtelings op de knoppen op het scherm."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Tik met twee vingers van je rechterhand beurtelings op de knoppen op het scherm."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Tik met twee vingers van je linkerhand beurtelings op de knoppen op het scherm."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Voer nu dezelfde test uit met je rechterhand."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Voer nu dezelfde test uit met je linkerhand."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tik eerst met de ene vinger en dan met de andere. Probeer zo gelijkmatig mogelijk te tikken. Ga %@ door met tikken."; "TAPPING_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tik op 'Volgende' om te beginnen."; "TAP_BUTTON_TITLE" = "Tik"; "TOTAL_TAPS_LABEL" = "Totaal aantal tikken"; -"TAPPING_INSTRUCTION" = "Tik zo snel mogelijk afwisselend met twee vingers op de knoppen."; - +"TAPPING_INSTRUCTION" = "Tik met twee vingers zo gelijkmatig mogelijk op de knoppen."; +"TAPPING_INSTRUCTION_RIGHT" = "Tik op de knoppen met de vingers van je RECHTERHAND."; +"TAPPING_INSTRUCTION_LEFT" = "Tik op de knoppen met de vingers van je LINKERHAND."; +"TAPPING_SKIP_TITLE" = "Sla deze hand over"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Stem"; "AUDIO_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen."; "AUDIO_INSTRUCTION" = "Zeg zo lang mogelijk 'aaaaah' in de microfoon."; "AUDIO_INTRO_TEXT" = "Haal diep adem en zeg zo lang mogelijk 'aaaaah' in de microfoon. Houd daarbij dezelfde geluidssterkte aan zodat de audiobalken blauw blijven."; -"AUDIO_INTENDED_USE" = "Tijdens deze activiteit wordt uw stemgeluid gemeten door dit op te nemen met de microfoon aan de onderkant van uw telefoon."; +"AUDIO_INTENDED_USE" = "Tijdens deze activiteit wordt je stemgeluid gemeten door dit op te nemen met de microfoon aan de onderkant van je telefoon."; "AUDIO_TOO_LOUD_LABEL" = "Te hard"; "AUDIO_GENERIC_ERROR_LABEL" = "Geluid opnemen niet mogelijk"; +"AUDIO_LEVEL_CHECK_LABEL" = "Even geduld. Het achtergrondgeluid wordt gecontroleerd."; +"AUDIO_TOO_LOUD_MESSAGE" = "Er is te veel omgevingsgeluid om je stem op te nemen. Ga naar een stillere plek en probeer het opnieuw."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tik op 'Volgende' als je klaar bent."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Toonaudiometrie"; -"TONE_AUDIOMETRY_INTENDED_USE" = "Met deze activiteit wordt gemeten of u verschillende geluiden kunt horen."; -"TONE_AUDIOMETRY_INTRO_TEXT" = "Sluit om te beginnen uw koptelefoon aan en zet deze op."; +"TONE_AUDIOMETRY_INTENDED_USE" = "Met deze activiteit wordt gemeten of je verschillende geluiden kunt horen."; +"TONE_AUDIOMETRY_INTRO_TEXT" = "Sluit om te beginnen je koptelefoon aan en zet deze op."; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen."; -"TONE_AUDIOMETRY_PREP_TEXT" = "U moet nu een toon horen. Pas het volume aan met de knoppen aan de zijkant van uw apparaat.\n\nTik op de knop wanneer u klaar bent om te beginnen."; -"TONE_AUDIOMETRY_INSTRUCTION" = "Tik op de knop telkens wanneer u een geluid begint te horen."; +"TONE_AUDIOMETRY_PREP_TEXT" = "Je moet nu een toon horen. Pas het volume aan met de knoppen aan de zijkant van je apparaat.\n\nTik op de knop wanneer je klaar bent om te beginnen."; +"TONE_AUDIOMETRY_INSTRUCTION" = "Tik op de knop telkens wanneer je een geluid begint te horen."; "TONE_LABEL_%@_LEFT" = "%@ Hz, links"; "TONE_LABEL_%@_RIGHT" = "%@ Hz, rechts"; /* Spatial span memory active task. */ "SPATIAL_SPAN_MEMORY_TITLE" = "Ruimtelijk geheugen"; -"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Tijdens deze activiteit wordt uw ruimtelijk kortetermijngeheugen gemeten door u de volgorde waarin %@ oplichten te laten herhalen."; +"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Tijdens deze activiteit wordt je ruimtelijk kortetermijngeheugen gemeten door je de volgorde waarin %@ oplichten te laten herhalen."; "SPATIAL_SPAN_MEMORY_TARGET_PLURAL" = "bloemen"; "SPATIAL_SPAN_MEMORY_TARGET_STANDALONE" = "bloemen"; "SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "Een aantal van de %@ licht een voor een op. Tik op die %@ in dezelfde volgorde als waarin ze oplichtten."; @@ -270,22 +305,22 @@ "MEMORY_GAME_FAILED_TITLE" = "Probeer het opnieuw"; "MEMORY_GAME_FAILED_MESSAGE" = "Het is niet helemaal gelukt dit keer. Tik op 'Volgende' om verder te gaan."; "MEMORY_GAME_TIMEOUT_TITLE" = "De tijd is om"; -"MEMORY_GAME_TIMEOUT_MESSAGE" = "U hebt het niet binnen de tijd gehaald.\nTik op 'Volgende' om verder te gaan."; +"MEMORY_GAME_TIMEOUT_MESSAGE" = "Je hebt het niet binnen de tijd gehaald.\nTik op 'Volgende' om verder te gaan."; "MEMORY_GAME_COMPLETE" = "Spel voltooid"; "MEMORY_GAME_PAUSED_TITLE" = "Pauze"; "MEMORY_GAME_PAUSED_MESSAGE" = "Tik op 'Ga door' om verder te gaan"; /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "Reactietijd"; -"REACTION_TIME_TASK_INTENDED_USE" = "Met deze activiteit wordt gekeken hoe snel u op een visuele aanwijzing reageert."; -"REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Schud het apparaat in een willekeurige richting zodra de blauwe stip op het scherm verschijnt. U wordt gevraagd om dit %D keer te doen."; +"REACTION_TIME_TASK_INTENDED_USE" = "Met deze activiteit wordt gekeken hoe snel je op een visuele aanwijzing reageert."; +"REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Schud het apparaat in een willekeurige richting zodra de blauwe stip op het scherm verschijnt. Je wordt gevraagd om dit %D keer te doen."; "REACTION_TIME_TASK_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen."; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "Poging %@ van %@"; "REACTION_TIME_TASK_ACTIVE_STEP_TITLE" = "Schud het apparaat snel heen en weer als de blauwe cirkel verschijnt"; /* Tower of Hanoi active task */ "TOWER_OF_HANOI_TASK_TITLE" = "Torens van Hanoi"; -"TOWER_OF_HANOI_TASK_INTENDED_USE" = "Met deze activiteit wordt gekeken hoe goed u puzzels kunt oplossen."; +"TOWER_OF_HANOI_TASK_INTENDED_USE" = "Met deze activiteit wordt gekeken hoe goed je puzzels kunt oplossen."; "TOWER_OF_HANOI_TASK_INTRO_TEXT" = "Verplaats de hele stapel in zo min mogelijk stappen naar het gemarkeerde platform."; "TOWER_OF_HANOI_TASK_TASK_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen"; "TOWER_OF_HANOI_TASK_ACTIVE_STEP_INTRO_TEXT" = "Los de puzzel op"; @@ -294,13 +329,13 @@ /* Timed walk active task. */ "TIMED_WALK_TITLE" = "Lopen met tijdmeting"; -"TIMED_WALK_INTRO_DETAIL" = "Met deze activiteit wordt het functioneren van uw onderlichaam gemeten."; -"TIMED_WALK_INTRO_2_TEXT_%@" = "Zoek een plek, bij voorkeur buiten, waar u veilig zo snel mogelijk ongeveer %@ in een rechte lijn kunt lopen. Vertraag uw tempo niet totdat u voorbij de eindstreep bent."; +"TIMED_WALK_INTRO_DETAIL" = "Met deze activiteit wordt het functioneren van je onderlichaam gemeten."; +"TIMED_WALK_INTRO_2_TEXT_%@" = "Zoek een plek, bij voorkeur buiten, waar je veilig zo snel mogelijk ongeveer %@ in een rechte lijn kunt lopen. Vertraag je tempo niet totdat je voorbij de eindstreep bent."; "TIMED_WALK_INTRO_2_DETAIL" = "Tik op 'Volgende' om te beginnen."; "TIMED_WALK_FORM_TITLE" = "Loophulpmiddel"; "TIMED_WALK_FORM_TEXT" = "Gebruik hetzelfde hulpmiddel voor elke test."; -"TIMED_WALK_QUESTION_TEXT" = "Draagt u een enkel-voetorthese?"; -"TIMED_WALK_QUESTION_2_TITLE" = "Gebruikt u een loophulpmiddel?"; +"TIMED_WALK_QUESTION_TEXT" = "Draag je een enkel-voetorthese?"; +"TIMED_WALK_QUESTION_2_TITLE" = "Gebruik je een loophulpmiddel?"; "TIMED_WALK_QUESTION_2_TEXT" = "Tik hier om een antwoord te kiezen."; "TIMED_WALK_QUESTION_2_CHOICE" = "Geen"; "TIMED_WALK_QUESTION_2_CHOICE_2" = "Eén wandelstok"; @@ -310,16 +345,16 @@ "TIMED_WALK_QUESTION_2_CHOICE_6" = "Looprek/Rollator"; "TIMED_WALK_INSTRUCTION_%@" = "Loop max. %@ in een rechte lijn."; "TIMED_WALK_INSTRUCTION_2" = "Draai om en loop terug naar het beginpunt."; -"TIMED_WALK_INSTRUCTION_TEXT" = "Tik op 'Gereed' als u klaar bent."; +"TIMED_WALK_INSTRUCTION_TEXT" = "Tik op 'Gereed' als je klaar bent."; /* PSAT active task. */ "PASAT_TITLE" = "PASAT"; "PVSAT_TITLE" = "PVSAT"; "PAVSAT_TITLE" = "PAVSAT"; -"PASAT_INTRO_TEXT" = "Met de PASAT (een stapsgewijze auditieve seriële opteltest) wordt gemeten hoe snel u hoorbare informatie verwerkt en hoe goed u kunt rekenen."; -"PVSAT_INTRO_TEXT" = "Met de PVSAT (een stapsgewijze visuele seriële opteltest) wordt gemeten hoe snel u zichtbare informatie verwerkt en hoe goed u kunt rekenen."; -"PAVSAT_INTRO_TEXT" = "Met de PAVSAT (een stapsgewijze auditieve en visuele seriële opteltest) wordt gemeten hoe snel u hoorbare en zichtbare informatie verwerkt en hoe goed u kunt rekenen."; -"PSAT_INTRO_TEXT_2_%@" = "Elke %@ seconden ziet en/of hoort u een cijfer.\nU moet elk nieuw cijfer optellen bij het vorige cijfer.\nLet op: u moet niet het totaal van alle cijfers berekenen, maar alleen de som van de laatste twee cijfers."; +"PASAT_INTRO_TEXT" = "Met de PASAT (een stapsgewijze auditieve seriële opteltest) wordt gemeten hoe snel je hoorbare informatie verwerkt en hoe goed je kunt rekenen."; +"PVSAT_INTRO_TEXT" = "Met de PVSAT (een stapsgewijze visuele seriële opteltest) wordt gemeten hoe snel je zichtbare informatie verwerkt en hoe goed je kunt rekenen."; +"PAVSAT_INTRO_TEXT" = "Met de PAVSAT (een stapsgewijze auditieve en visuele seriële opteltest) wordt gemeten hoe snel je hoorbare en zichtbare informatie verwerkt en hoe goed je kunt rekenen."; +"PSAT_INTRO_TEXT_2_%@" = "Elke %@ seconden ziet en/of hoor je een cijfer.\nJe moet elk nieuw cijfer optellen bij het vorige cijfer.\nLet op: je moet niet het totaal van alle cijfers berekenen, maar alleen de som van de laatste twee cijfers."; "PSAT_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen."; "PSAT_INITIAL_INSTRUCTION" = "Onthoud dit eerste cijfer."; "PSAT_INSTRUCTION" = "Tel dit nieuwe cijfer op bij het vorige."; @@ -327,24 +362,66 @@ /* Hole peg test active task. */ "HOLE_PEG_TEST_TITLE_%@" = "%@-schijventest"; -"HOLE_PEG_TEST_INTRO_TEXT_%@" = "Tijdens deze activiteit meet u het functioneren van uw bovenste ledematen door een schijfje in een cirkel te plaatsen. Dit moet u %@ keer doen."; -"HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "Zowel uw linker- als rechterhand wordt getest.\nU moet het schijfje zo snel mogelijk oppakken en in de cirkel plaatsen. Nadat u dit %@ keer hebt gedaan, moet u het schijfje %@ keer weer weghalen."; -"HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "Zowel uw rechter- als linkerhand wordt getest.\nU moet het schijfje zo snel mogelijk oppakken en in de cirkel plaatsen. Nadat u dit %@ keer hebt gedaan, moet u het schijfje %@ keer weer weghalen."; +"HOLE_PEG_TEST_INTRO_TEXT_%@" = "Tijdens deze activiteit mee je het functioneren van je bovenste ledematen door een schijfje in een cirkel te plaatsen. Dit moet je %@ keer doen."; +"HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "Zowel je linker- als rechterhand wordt getest.\nJe moet het schijfje zo snel mogelijk oppakken en in de cirkel plaatsen. Nadat je dit %@ keer hebt gedaan, moet je het schijfje %@ keer weer weghalen."; +"HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "Zowel je rechter- als linkerhand wordt getest.\nJe moet het schijfje zo snel mogelijk oppakken en in de cirkel plaatsen. Nadat je dit %@ keer hebt gedaan, moet je het schijfje %@ keer weer weghalen."; "HOLE_PEG_TEST_CALL_TO_ACTION" = "Tik op 'Start' om te beginnen."; -"HOLE_PEG_TEST_PLACE_INSTRUCTION_LEFT_HAND" = "Plaats met uw linkerhand het schijfje in de cirkel."; -"HOLE_PEG_TEST_PLACE_INSTRUCTION_RIGHT_HAND" = "Plaats met uw rechterhand het schijfje in de cirkel."; -"HOLE_PEG_TEST_REMOVE_INSTRUCTION_LEFT_HAND" = "Plaats met uw linkerhand het schijfje achter de lijn."; -"HOLE_PEG_TEST_REMOVE_INSTRUCTION_RIGHT_HAND" = "Plaats met uw rechterhand het schijfje achter de lijn."; +"HOLE_PEG_TEST_PLACE_INSTRUCTION_LEFT_HAND" = "Plaats met je linkerhand het schijfje in de cirkel."; +"HOLE_PEG_TEST_PLACE_INSTRUCTION_RIGHT_HAND" = "Plaats met je rechterhand het schijfje in de cirkel."; +"HOLE_PEG_TEST_REMOVE_INSTRUCTION_LEFT_HAND" = "Plaats met je linkerhand het schijfje achter de lijn."; +"HOLE_PEG_TEST_REMOVE_INSTRUCTION_RIGHT_HAND" = "Plaats met je rechterhand het schijfje achter de lijn."; "HOLE_PEG_TEST_TEXT" = "Pak het schijfje op met twee vingers."; -"HOLE_PEG_TEST_TEXT_2" = "Til uw vingers op om het schijfje los te laten."; +"HOLE_PEG_TEST_TEXT_2" = "Til je vingers op om het schijfje los te laten."; + +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Trillingsactiviteit"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Met deze activiteit wordt gemeten hoe sterk je handen trillen in verschillende posities. Ga naar een plek waar je comfortabel kunt zitten gedurende deze activiteit."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Houd de telefoon in de hand waarvan je de meeste last heeft, zoals hieronder afgebeeld."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Houd de telefoon in je RECHTERHAND, zoals hieronder afgebeeld."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Houd de telefoon in je LINKERHAND, zoals hieronder afgebeeld."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Je wordt gevraagd om %@ zittend uit te voeren met de telefoon in je hand."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "een taak"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "twee taken"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "drie taken"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "vier taken"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "vijf taken"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tik op 'Volgende' om door te gaan."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Bereid je voor om de telefoon in je schoot te houden."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Bereid je voor om de telefoon in je schoot te houden met je LINKERHAND."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Bereid je voor om de telefoon in je schoot te houden met je RECHTERHAND."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Houd de telefoon %ld seconden vast in je schoot."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Houd nu de telefoon op schouderhoogte in je uitgestoken hand."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Houd nu de telefoon op schouderhoogte in je uitgestoken LINKERHAND."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Houd nu de telefoon op schouderhoogte in je uitgestoken RECHTERHAND."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Houd de telefoon %ld seconden vast in je uitgestoken hand."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Houd nu de telefoon op schouderhoogte terwijl je je elleboog gebogen houdt."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Houd nu de telefoon op schouderhoogte in je LINKERHAND terwijl je je elleboog gebogen houdt."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Houd nu de telefoon op schouderhoogte in je RECHTERHAND terwijl je je elleboog gebogen houdt."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Houd de telefoon %ld seconden vast terwijl je je elleboog gebogen houdt"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Raak nu je neus herhaaldelijk aan met de telefoon terwijl je je elleboog gebogen houdt."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Houd nu de telefoon in je LINKERHAND en raak je neus herhaaldelijk aan met de telefoon terwijl je je elleboog gebogen houdt."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Houd nu de telefoon in je RECHTERHAND en raak je neus herhaaldelijk aan met de telefoon terwijl je je elleboog gebogen houdt."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Raak %ld seconden je neus aan met de telefoon"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Bereid je voor om te wuiven vanuit de pols."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Bereid je voor om te wuiven vanuit de pols met de telefoon in je LINKERHAND."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Bereid je voor om te wuiven vanuit de pols met de telefoon in je RECHTERHAND."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Wuif %ld seconden vanuit de pols."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Neem de telefoon nu in je LINKERHAND en ga door met de volgende taak."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Neem de telefoon nu in je RECHTERHAND en ga door met de volgende taak."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Ga door naar de volgende taak."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activiteit voltooid."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Je wordt gevraagd om %@ zittend uit te voeren met de telefoon in de ene hand en daarna opnieuw met de telefoon in de andere hand."; +"TREMOR_SKIP_LEFT_HAND" = "Ik kan deze activiteit niet met mijn LINKERHAND uitvoeren."; +"TREMOR_SKIP_RIGHT_HAND" = "Ik kan deze activiteit niet met mijn RECHTERHAND uitvoeren."; +"TREMOR_SKIP_NEITHER" = "Ik kan deze activiteit met beide handen uitvoeren."; /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Bestand aanmaken mislukt"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Er kunnen niet genoeg logbestanden worden verwijderd om de drempel te halen"; "ERROR_DATALOGGER_SET_ATTRIBUTE" = "Fout bij kenmerk instellen"; "ERROR_DATALOGGER_COULD_NOT_MAORK" = "Bestand niet gemarkeerd als verwijderd (niet gemarkeerd als geüpload)"; -"ERROR_DATALOGGER_MULTIPLE" = "Meerder fouten bij logbestanden verwijderen"; +"ERROR_DATALOGGER_MULTIPLE" = "Meerdere fouten bij logbestanden verwijderen"; "ERROR_RECORDER_NO_DATA" = "Geen verzamelde gegevens gevonden."; "ERROR_RECORDER_NO_OUTPUT_DIRECTORY" = "Geen uitvoerdirectory opgegeven"; @@ -357,7 +434,7 @@ "AX_IMAGE_ILLUSTRATION" = "Afbeelding van %@"; "AX_SIGNVIEW_LABEL" = "Veld voor handtekening"; -"AX_SIGNVIEW_HINT" = "Beweeg uw vinger over het scherm om uw handtekening te zetten"; +"AX_SIGNVIEW_HINT" = "Beweeg je vinger over het scherm om je handtekening te zetten"; "AX_SIGNVIEW_SIGNED" = "Ondertekend"; "AX_SIGNVIEW_UNSIGNED" = "Niet ondertekend"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Voorvertoning opname"; "AX_IMAGE_CAPTURED_LABEL" = "Vastgelegde afbeelding"; +"AX_VIDEO_CAPTURE_LABEL" = "Voorvertoning video-opname"; +"AX_VIDEO_CAPTURED_LABEL" = "Vastgelegde video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "De schijf met grootte %@ kan niet op de schijf met grootte %@ worden geplaatst."; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Doel"; "AX_TOWER_OF_HANOI_TOWER" = "Toren"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Heeft schijf met groottes %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Leeg"; -"AX_GRAPH_RANGE_FORMAT" = "Bereik van %@ tot %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Bereik van %@ tot %@"; +"AX_GRAPH_STACK_PREFIX" = "Stack bestaat uit"; "AX_GRAPH_AND_SEPARATOR" = " en "; "AX_GRAPH_POINT_%@" = "Punt: %@"; diff --git a/ResearchKit/Localized/nl.lproj/locversion.plist b/ResearchKit/Localized/nl.lproj/locversion.plist index 3e6f8aa1..4088b17e 100644 --- a/ResearchKit/Localized/nl.lproj/locversion.plist +++ b/ResearchKit/Localized/nl.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale nl LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/no.lproj/ResearchKit.strings b/ResearchKit/Localized/no.lproj/ResearchKit.strings index 274553ae..4f60bdda 100644 --- a/ResearchKit/Localized/no.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/no.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Kun numeriske tegn er tillatt."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Framdriftsindikator for inntasting av kode"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ av %@ sifre oppgitt"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Glemt koden?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Kunne ikke legge til nøkkelringobjekt."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nei"; "BOOL_YES" = "Ja"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "fot"; +"MEASURING_UNIT_IN" = "to"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Trykk for å svare"; "NULL_ANSWER" = "Velg et svar"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Spar til senere"; "BUTTON_OPTION_DISCARD" = "Forkast resultater"; "BUTTON_OPTION_STOP_TASK" = "Avslutt oppgave"; +"BUTTON_SAVE" = "Arkiver"; +"BUTTON_CLEAR_ANSWER" = "Fjern svar"; +"BUTTON_READ_ONLY_MODE" = "Dette svaret kan ikke endres."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Starter aktivitet om"; "TASK_COMPLETE_TITLE" = "Aktivitet fullført"; "TASK_COMPLETE_TEXT" = "Dataene vil bli analysert, og du blir varslet når resultatene er klare."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ sekunder gjenstår."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Ta bilde"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Du har ikke angitt en katalog for bildene du tar."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Bildet kunne ikke arkiveres."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Start opptak"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stopp opptak"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Spill inn video på nytt"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kondisjon"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Strekning (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Snu og gå tilbake der du startet."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Gå opptil %ld skritt i rett linje."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Finn et sted hvor du trygt kan gå fram og tilbake i en rett linje. Prøv å gå kontinuerlig når du skal snu, som om du skal gå rundt en kjegle.\n\nDu vil bli deretter bedt om å snu deg helt rundt og stå helt stille med armene ned langs siden og føttene med en skulderbreddes avstand."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Trykk på Kom i gang når du er klar til å starte.\nPlasser deretter telefonen i en lomme eller veske, og følg lydinstruksjonene."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Gå fram og tilbake i en rett linje i %@. Gå så normalt så mulig."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Snu deg helt rundt og stå stille i %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Du har fullført aktiviteten."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Trykkhastighet"; +"TAPPING_TASK_TITLE_RIGHT" = "Høyre hånd"; +"TAPPING_TASK_TITLE_LEFT" = "Venstre hånd"; "TAPPING_INTRO_TEXT" = "Denne aktiviteten måler trykkhastigheten din."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Legg telefonen på et flatt underlag. To knapper vises på skjermen i %@. Bruk to fingre på samme hånd og trykk vekselvis på knappene så fort du kan."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Plasser telefonen på en flat overflate."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Bruk to fingre på samme hånd til å trykke vekselvis på knappene på skjermen."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Bruk to fingre på høyre hånd til å trykke vekselvis på knappene på skjermen."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Bruk to fingre på venstre hånd til å trykke vekselvis på knappene på skjermen."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Gjør den samme testen med høyre hånd."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Gjør den samme testen med venstre hånd."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Trykk med én finger, og deretter den andre. Veksle mellom knappene i jevne intervaller. Fortsett å trykke i %@."; "TAPPING_CALL_TO_ACTION" = "Trykk på Start for å begynne."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Trykk på Neste for å begynne."; "TAP_BUTTON_TITLE" = "Trykk"; "TOTAL_TAPS_LABEL" = "Trykk totalt"; -"TAPPING_INSTRUCTION" = "Trykk på knappene så fort du kan med to fingre."; - +"TAPPING_INSTRUCTION" = "Trykk på knappene så jevnt som du klarer, med to fingre."; +"TAPPING_INSTRUCTION_RIGHT" = "Trykk på knappene med din HØYRE hånd."; +"TAPPING_INSTRUCTION_LEFT" = "Trykk på knappene med din VENSTRE hånd."; +"TAPPING_SKIP_TITLE" = "Utelat denne hånden"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Stemme"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Aktiviteten vil evaluere stemmen din ved å ta den opp i mikrofonen i nedre kant av telefonen."; "AUDIO_TOO_LOUD_LABEL" = "For høyt"; "AUDIO_GENERIC_ERROR_LABEL" = "Kan ikke ta opp lyd"; +"AUDIO_LEVEL_CHECK_LABEL" = "Vent mens vi kontrollerer støynivået i bakgrunnen."; +"AUDIO_TOO_LOUD_MESSAGE" = "Støynivået fra omgivelsene er for høyt til å gjøre opptak av stemmen din. Gå til et sted mindre støy, og prøv igjen."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Trykk på Neste når du er klar."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Toneaudiometri"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Bruk to fingre til å løfte opp pluggen."; "HOLE_PEG_TEST_TEXT_2" = "Løft fingrene for å slippe pluggen."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Skjelving – aktivitet"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Denne aktiviteten måler skjelving i hendene dine i forskjellige posisjoner. Finn et sted hvor du kan sitte i ro i løpet av denne aktiviteten."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Hold telefonen i hånden som er hardest rammet, som vist i bildet nedenfor."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Hold telefonen i din HØYRE hånd som vist i bildet nedenfor."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Hold telefonen i din VENSTRE hånd som vist i bildet nedenfor."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Du vil bli bedt om å utføre %@ mens du sitter med telefonen i den ene hånden."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "en oppgave"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "to oppgaver"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tre oppgaver"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "fire oppgaver"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "fem oppgaver"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Trykk på Neste for å gå videre."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Forbered deg på å holde telefonen i fanget."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Forbered deg på å holde telefonen i fanget med VENSTRE hånd."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Forbered deg på å holde telefonen i fanget med HØYRE hånd."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Hold telefonen i fanget i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Hold telefonen med utstrakt hånd i skulderhøyde."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Hold telefonen med VENSTRE hånd utstrakt i skulderhøyde."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Hold telefonen med HØYRE hånd utstrakt i skulderhøyde."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Hold telefonen med utstrakt hånd i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Hold telefonen i skulderhøyde med albuen bøyd."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Hold telefonen med VENSTRE hånd i skulderhøyde med albuen bøyd."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Hold telefonen med HØYRE hånd i skulderhøyde med albuen bøyd."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Hold telefonen med albuen bøyd i %ld sekunder"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Hold albuen bøyd, og trykk telefonen mot nesen gjentatte ganger."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Hold albuen bøyd med telefonen i VENSTRE hånd, og trykk telefonen mot nesen gjentatte ganger."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Hold albuen bøyd med telefonen i HØYRE hånd, og trykk telefonen mot nesen gjentatte ganger."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Hold telefonen mot nesen i %ld sekunder"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Forbered deg på å vinke som en dronning (vink ved å vri på håndleddet)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Forbered deg på å vinke som en dronning med telefonen i VENSTRE hånd (vink ved å vri på håndleddet)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Forbered deg på å vinke som en dronning med telefonen i HØYRE hånd (vink ved å vri på håndleddet)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Vink som en dronning i %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Flytt telefonen til VENSTRE hånd, og fortsett oppgaven."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Flytt telefonen til HØYRE hånd, og fortsett oppgaven."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Fortsett til neste oppgave."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivitet fullført."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Du vil bli bedt om å utføre %@ mens du sitter med telefonen i den ene hånden, og deretter igjen med den andre hånden."; +"TREMOR_SKIP_LEFT_HAND" = "Jeg kan ikke utføre denne aktiviteten med min VENSTRE hånd."; +"TREMOR_SKIP_RIGHT_HAND" = "Jeg kan ikke utføre denne aktiviteten med min HØYRE hånd."; +"TREMOR_SKIP_NEITHER" = "Jeg kan utføre denne aktiviteten med begge hender."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Kunne ikke opprette fil"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Kunne ikke fjerne nok loggfiler til å nå grensen"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Forhåndsvisning av bilde"; "AX_IMAGE_CAPTURED_LABEL" = "Tatt bilde"; +"AX_VIDEO_CAPTURE_LABEL" = "Forhåndsvisning av videoopptak"; +"AX_VIDEO_CAPTURED_LABEL" = "Innspilt video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Kan ikke plassere skive med størrelse %@ på skive med størrelse %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Mål"; "AX_TOWER_OF_HANOI_TOWER" = "Tårn"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Har skive med størrelse %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Tom"; -"AX_GRAPH_RANGE_FORMAT" = "Område fra %@ til %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Område fra %@ til %@"; +"AX_GRAPH_STACK_PREFIX" = "Stabel bestående av"; "AX_GRAPH_AND_SEPARATOR" = " og "; "AX_GRAPH_POINT_%@" = "Punkt: %@"; diff --git a/ResearchKit/Localized/no.lproj/locversion.plist b/ResearchKit/Localized/no.lproj/locversion.plist index 5042878c..49428b20 100644 --- a/ResearchKit/Localized/no.lproj/locversion.plist +++ b/ResearchKit/Localized/no.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale no LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/pl.lproj/ResearchKit.strings b/ResearchKit/Localized/pl.lproj/ResearchKit.strings index 802579ed..0805fb82 100644 --- a/ResearchKit/Localized/pl.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/pl.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Dozwolone są tylko znaki numeryczne."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Wskaźnik postępu podawania kodu"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Liczba wprowadzonych cyfr: %@ z %@"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Nie pamiętasz kodu?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Nie można było dodać rzeczy pęku kluczy."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nie"; "BOOL_YES" = "Tak"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "cale"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Stuknij, aby odpowiedzieć"; "NULL_ANSWER" = "Wybierz odpowiedź"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Zachowaj na później"; "BUTTON_OPTION_DISCARD" = "Odrzuć wyniki"; "BUTTON_OPTION_STOP_TASK" = "Zakończ zadanie"; +"BUTTON_SAVE" = "Zachowaj"; +"BUTTON_CLEAR_ANSWER" = "Wymaż odpowiedź"; +"BUTTON_READ_ONLY_MODE" = "Nie można modyfikować tej odpowiedzi."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Początek ćwiczenia za"; "TASK_COMPLETE_TITLE" = "Ćwiczenie zakończone"; "TASK_COMPLETE_TEXT" = "Twoje dane zostaną przeanalizowane i otrzymasz powiadomienie o wynikach."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Pozostało: %@ s."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Zarejestruj obraz"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Nie wskazano katalogu wyjściowego dla zarejestrowanych obrazów."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Nie można było zachować zarejestrowanego obrazu."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Rozpocznij nagrywanie"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Zatrzymaj nagrywanie"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Zarejestruj wideo ponownie"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Sprawność"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Dystans (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Odwróć się i przejdź do miejsca startu."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Idź prosto i zatrzymaj się po maksymalnie %ld krokach."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Znajdź miejsce, w którym możesz bezpiecznie chodzić w tę i z powrotem w linii prostej. Próbuj chodzić w sposób ciągły, zawracając na końcach tak, jak robi się to wokół słupka.\n\nNastępnie wykonasz pełny obrót i staniesz z rękoma ułożonymi wzdłuż ciała i stopami rozstawionymi do szerokości ramion."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Aby rozpocząć, stuknij w Start.\nNastępnie umieść telefon w kieszeni lub torbie i postępuj zgodnie z instrukcjami dźwiękowymi."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Chodź zwykłym krokiem w tę i z powrotem w linii prostej przez %@."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Wykonaj pełny obrót i stój bez ruchu przez %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Ćwiczenie zostało ukończone."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Szybkość stukania"; +"TAPPING_TASK_TITLE_RIGHT" = "Prawa ręka"; +"TAPPING_TASK_TITLE_LEFT" = "Lewa ręka"; "TAPPING_INTRO_TEXT" = "To ćwiczenie ocenia Twoją szybkość stukania."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Połóż telefon na płaskiej powierzchni. Przez %@ na ekranie będą wyświetlane dwa przyciski. Używając dwóch palców tej samej ręki stukaj w nie na przemian jak najszybciej potrafisz."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Połóż telefon na płaskiej powierzchni."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Naprzemiennie stukaj w przyciski na ekranie dwoma palcami tej samej ręki."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Naprzemiennie stukaj w przyciski na ekranie dwoma palcami prawej ręki."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Naprzemiennie stukaj w przyciski na ekranie dwoma palcami lewej ręki."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Teraz wykonaj to ćwiczenie prawą ręką."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Teraz wykonaj to ćwiczenie lewą ręką."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Stukaj na zmianę jednym i drugim palcem. Próbuj stukać możliwie miarowo. Stukaj przez %@."; "TAPPING_CALL_TO_ACTION" = "Aby rozpocząć, stuknij w Start."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Aby rozpocząć, stuknij w Dalej."; "TAP_BUTTON_TITLE" = "Stuknij"; "TOTAL_TAPS_LABEL" = "Liczba stuknięć"; -"TAPPING_INSTRUCTION" = "Stukaj w przyciski dwoma palcami jak najszybciej potrafisz."; - +"TAPPING_INSTRUCTION" = "Stukaj w przyciski dwoma palcami możliwie miarowo."; +"TAPPING_INSTRUCTION_RIGHT" = "Stukaj w przyciski PRAWĄ ręką."; +"TAPPING_INSTRUCTION_LEFT" = "Stukaj w przyciski LEWĄ ręką."; +"TAPPING_SKIP_TITLE" = "Pomiń tę rękę"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Głos"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "To ćwiczenie ocenia Twój głos, nagrywając go przy użyciu mikrofonu znajdującego się u dołu telefonu."; "AUDIO_TOO_LOUD_LABEL" = "Zbyt głośno"; "AUDIO_GENERIC_ERROR_LABEL" = "Nie można nagrać dźwięku"; +"AUDIO_LEVEL_CHECK_LABEL" = "Czekaj, sprawdzamy poziom szumu tła."; +"AUDIO_TOO_LOUD_MESSAGE" = "Szum otoczenia jest zbyt głośny, aby nagrać Twój głos. Przenieś się w cichsze miejsce i spróbuj ponownie."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Aby rozpocząć, stuknij w Dalej."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometria tonalna"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Podnieś „kołek” dwoma palcami."; "HOLE_PEG_TEST_TEXT_2" = "Unieś palce, aby upuścić „kołek”."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Ćwiczenie oceniające drżenie rąk"; +"TREMOR_TEST_INTRO_1_DETAIL" = "To ćwiczenie ocenia drżenie rąk w różnych pozycjach. Na czas tego ćwiczenia znajdź miejsce, w którym możesz wygodnie siedzieć."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Trzymaj telefon w bardziej drżącej ręce, tak jak na obrazku poniżej."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Trzymaj telefon w PRAWEJ ręce, tak jak na obrazku poniżej."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Trzymaj telefon w LEWEJ ręce, tak jak na obrazku poniżej."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Wykonasz %@ w pozycji siedzącej, trzymając telefon w ręce."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "zadanie"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dwa zadania"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "trzy zadania"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "cztery zadania"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "pięć zadań"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Aby kontynuować, stuknij w Dalej."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Przygotuj się do trzymania telefonu na kolanach."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Przygotuj się do trzymania telefonu na kolanach LEWĄ ręką."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Przygotuj się do trzymania telefonu na kolanach PRAWĄ ręką."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Trzymaj telefon na kolanach przez %ld s."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Teraz trzymaj telefon w wyciągniętej ręce na wysokości barku."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Teraz trzymaj telefon w wyciągniętej LEWEJ ręce na wysokości barku."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Teraz trzymaj telefon w wyciągniętej PRAWEJ ręce na wysokości barku."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Trzymaj telefon w wyciągniętej ręce przez %ld s."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Teraz trzymaj telefon w ręce ugiętej w łokciu na wysokości barku."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Teraz trzymaj telefon w LEWEJ ręce ugiętej w łokciu na wysokości barku."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Teraz trzymaj telefon w PRAWEJ ręce ugiętej w łokciu na wysokości barku."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Trzymaj telefon w ręce zgiętej w łokciu przez %ld s"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Teraz, trzymając telefon w ręce zgiętej w łokciu, dotknij nim nosa i powtarzaj tę czynność."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Teraz, trzymając telefon w LEWEJ ręce zgiętej w łokciu, dotknij nim nosa i powtarzaj tę czynność."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Teraz, trzymając telefon w PRAWEJ ręce zgiętej w łokciu, dotknij nim nosa i powtarzaj tę czynność."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Dotykaj telefonem nosa przez %ld s"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Przygotuj się do machania dłonią, zginając rękę w nadgarstku."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Przygotuj się do machania LEWĄ dłonią, zginając rękę w nadgarstku."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Przygotuj się do machania PRAWĄ dłonią, zginając rękę w nadgarstku."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Unieś rękę i machaj dłonią, zginając rękę w nadgarstku, przez %ld s."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Teraz przełóż telefon do LEWEJ ręki i przejdź do następnego zadania."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Teraz przełóż telefon do PRAWEJ ręki i przejdź do następnego zadania."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Przejdź do następnego zadania."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Ćwiczenie ukończone."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Wykonasz %@ w pozycji siedzącej z telefonem w jednej ręce, a następnie w drugiej."; +"TREMOR_SKIP_LEFT_HAND" = "Nie mogę wykonywać tego ćwiczenia LEWĄ ręką."; +"TREMOR_SKIP_RIGHT_HAND" = "Nie mogę wykonywać tego ćwiczenia PRAWĄ ręką."; +"TREMOR_SKIP_NEITHER" = "Mogę wykonywać to ćwiczenie obiema rękami."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Nie można było utworzyć pliku"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Nie można było usunąć liczby plików dzienników pozwalającej na osiągnięcie progu"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Zarejestruj podgląd"; "AX_IMAGE_CAPTURED_LABEL" = "Zarejestrowany obraz"; +"AX_VIDEO_CAPTURE_LABEL" = "Podgląd rejestracji wideo"; +"AX_VIDEO_CAPTURED_LABEL" = "Zarejestrowane wideo"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Nie można umieścić dysku o rozmiarze %@ na dysku o rozmiarze %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Krążek docelowy"; "AX_TOWER_OF_HANOI_TOWER" = "Wieża"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Zawiera krążki o rozmiarach %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Pusta"; -"AX_GRAPH_RANGE_FORMAT" = "Zakres %@–%@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Zakres %@–%@"; +"AX_GRAPH_STACK_PREFIX" = "Stos złożony z"; "AX_GRAPH_AND_SEPARATOR" = " i "; "AX_GRAPH_POINT_%@" = "Punkt: %@"; diff --git a/ResearchKit/Localized/pl.lproj/locversion.plist b/ResearchKit/Localized/pl.lproj/locversion.plist index e03ae9c3..137a97b7 100644 --- a/ResearchKit/Localized/pl.lproj/locversion.plist +++ b/ResearchKit/Localized/pl.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale pl LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/pt.lproj/ResearchKit.strings b/ResearchKit/Localized/pt.lproj/ResearchKit.strings index 1fe898e5..c7beef27 100644 --- a/ResearchKit/Localized/pt.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/pt.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Apenas caracteres numéricos são permitidos."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicador de progresso de inserção de código"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Você digitou %@ de %@ dígitos"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Esqueceu o Código?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Não foi possível adicionar a chave."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Não"; "BOOL_YES" = "Sim"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "pés"; +"MEASURING_UNIT_IN" = "pol"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Toque para responder"; "NULL_ANSWER" = "Selecione uma resposta"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Salvar para Mais Tarde"; "BUTTON_OPTION_DISCARD" = "Descartar Resultados"; "BUTTON_OPTION_STOP_TASK" = "Finalizar Tarefa"; +"BUTTON_SAVE" = "Salvar"; +"BUTTON_CLEAR_ANSWER" = "Limpar resposta"; +"BUTTON_READ_ONLY_MODE" = "Esta resposta não pode ser modificada."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Iniciando atividade em"; "TASK_COMPLETE_TITLE" = "Atividade Concluída"; "TASK_COMPLETE_TEXT" = "Seus dados serão analisados e você será notificado quando os resultados estiverem prontos."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ segundos restantes."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturar Imagem"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Não foi especificado um diretório de saída para imagens capturadas."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "A imagem capturada não pôde ser salva."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Iniciar Gravação"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Parar Gravação"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapturar Vídeo"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Condicionamento Físico"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distância (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Vire-se e volte para o local onde você começou."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Dê até %ld passos em linha reta."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Encontre um local onde você possa andar para a frente e para trás em linha reta com segurança. Tente andar continuamente, virando ao final do caminho, como se estivesse dando a volta em um cone.\n\nA seguir, você será instruído a virar em um círculo completo e ficar parado com os braços ao lado do corpo e os pés separados pela distância entre os ombros."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Toque em Iniciar quando estiver pronto.\nColoque o telefone em um bolso ou bolsa e siga as instruções de áudio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Ande para a frente e para trás em linha reta por %@. Ande normalmente."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Vire em um círculo completo e fique parado por %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Você concluiu a atividade."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Velocidade de Toque"; +"TAPPING_TASK_TITLE_RIGHT" = "Mão Direita"; +"TAPPING_TASK_TITLE_LEFT" = "Mão Esquerda"; "TAPPING_INTRO_TEXT" = "Esta atividade mede a sua velocidade de toque."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Coloque o telefone sob uma superfície plana. Dois botões aparecerão na tela por %@. Com dois dedos da mesma mão, toque nos botões alternadamente o mais rápido que conseguir."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Coloque o telefone em uma superfície plana."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Use dois dedos da mesma mão para tocar nos botões da tela alternadamente."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Use dois dedos da mão direita para tocar nos botões da tela alternadamente."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Use dois dedos da mão esquerda para tocar nos botões da tela alternadamente."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Agora repita o mesmo teste com a mão direita."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Agora repita o mesmo teste com a mão esquerda."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Toque um dedo e depois o outro. Tente manter o ritmo dos toques o mais constante possível. Continue tocando por %@."; "TAPPING_CALL_TO_ACTION" = "Toque em Iniciar para começar."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Toque em Seguinte para começar."; "TAP_BUTTON_TITLE" = "Toque"; "TOTAL_TAPS_LABEL" = "Total de Toques"; -"TAPPING_INSTRUCTION" = "Toque nos botões o mais rápido que conseguir usando dois dedos."; - +"TAPPING_INSTRUCTION" = "Toque nos botões com o máximo de consistência que puder usando dois dedos."; +"TAPPING_INSTRUCTION_RIGHT" = "Toque nos botões usando a mão DIREITA."; +"TAPPING_INSTRUCTION_LEFT" = "Toque nos botões usando a mão ESQUERDA."; +"TAPPING_SKIP_TITLE" = "Ignorar esta mão"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voz"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Esta atividade avalia a sua voz gravando-a com o microfone na parte inferior do telefone."; "AUDIO_TOO_LOUD_LABEL" = "Alto Demais"; "AUDIO_GENERIC_ERROR_LABEL" = "Não foi possível gravar áudio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Aguarde a verificação do nível de ruído de fundo."; +"AUDIO_TOO_LOUD_MESSAGE" = "O nível de ruído ambiente está muito alto para gravar a sua voz. Vá até um local mais silencioso e tente novamente."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Toque em Seguinte quando pronto."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometria Tonal"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Pegue o círculo usando dois dedos."; "HOLE_PEG_TEST_TEXT_2" = "Tire o dedo da tela para largar o círculo."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Atividade de Tremor"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Esta atividade mede o tremor das mãos em várias posições. Encontre um local onde você possa se sentar confortavelmente durante esta atividade."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Segure o telefone na mão mais afetada, conforme mostrado na imagem abaixo."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Segure o telefone na mão DIREITA, conforme mostrado na imagem abaixo."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Segure o telefone na mão ESQUERDA, conforme mostrado na imagem abaixo."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Você será solicitado a realizar %@ sentado com o telefone na mão."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "uma tarefa"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "duas tarefas"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "três tarefas"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "quatro tarefas"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinco tarefas"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Toque em Seguinte para prosseguir."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepare-se para segurar o telefone na perna."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepare-se para segurar o telefone na perna com a mão ESQUERDA."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepare-se para segurar o telefone na perna com a mão DIREITA."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Continue segurando o telefone na perna por %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Agora segure o telefone com a mão estendida na altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Agora segure o telefone com a mão ESQUERDA estendida na altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Agora segure o telefone com a mão DIREITA estendida na altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Continue segurando o telefone com a mão estendida por %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Agora segure o telefone na altura do ombro com o cotovelo dobrado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Agora segure o telefone com a mão ESQUERDA na altura do ombro com o cotovelo dobrado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Agora segure o telefone com a mão DIREITA na altura do ombro com o cotovelo dobrado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Continue segurando o telefone com o cotovelo dobrado por %ld segundos"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Agora, mantendo o cotovelo dobrado, toque o telefone no nariz repetidamente."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Agora, mantendo o cotovelo dobrado e com o telefone na mão ESQUERDA, toque o telefone no nariz repetidamente."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Agora, mantendo o cotovelo dobrado e com o telefone na mão DIREITA, toque o telefone no nariz repetidamente."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Continue tocando o telefone no nariz por %ld segundos"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepare-se para fazer um aceno como da rainha (acene virando o pulso)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepare-se para fazer um aceno como da rainha com o telefone na mão ESQUERDA (acene virando o pulso)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepare-se para fazer um aceno como da rainha com o telefone na mão DIREITA (acene virando o pulso)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Continue fazendo um aceno como da rainha por %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Agora passe o telefone para a mão ESQUERDA e continue para a tarefa seguinte."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Agora passe o telefone para a mão DIREITA e continue para a tarefa seguinte."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Continue para a tarefa seguinte."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Atividade concluída."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Você será solicitado a realizar %@ sentado com o telefone em uma das mãos e, depois, na outra."; +"TREMOR_SKIP_LEFT_HAND" = "Não posso realizar esta atividade com a mão ESQUERDA."; +"TREMOR_SKIP_RIGHT_HAND" = "Não posso realizar esta atividade com a mão DIREITA."; +"TREMOR_SKIP_NEITHER" = "Posso realizar esta atividade com ambas as mãos."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Não foi possível criar o arquivo"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Não foi possível remover arquivos de registro suficientes para alcançar o limite"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Pré-visualização da captura"; "AX_IMAGE_CAPTURED_LABEL" = "Imagem capturada"; +"AX_VIDEO_CAPTURE_LABEL" = "Pré-visualização da captura de vídeo"; +"AX_VIDEO_CAPTURED_LABEL" = "Vídeo capturado"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Não pôde colocar o disco com %@ de tamanho no disco com %@ de tamanho"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Destino"; "AX_TOWER_OF_HANOI_TOWER" = "Torre"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Tem disco com tamanhos %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Esvaziar"; -"AX_GRAPH_RANGE_FORMAT" = "Varia entre %@ e %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Varia entre %@ e %@"; +"AX_GRAPH_STACK_PREFIX" = "Pilha composta de"; "AX_GRAPH_AND_SEPARATOR" = " e "; "AX_GRAPH_POINT_%@" = "Ponto: %@"; diff --git a/ResearchKit/Localized/pt.lproj/locversion.plist b/ResearchKit/Localized/pt.lproj/locversion.plist index 41e47d21..48643fd6 100644 --- a/ResearchKit/Localized/pt.lproj/locversion.plist +++ b/ResearchKit/Localized/pt.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale pt LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/pt_PT.lproj/ResearchKit.strings b/ResearchKit/Localized/pt_PT.lproj/ResearchKit.strings index ba18fc76..b67bf182 100644 --- a/ResearchKit/Localized/pt_PT.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/pt_PT.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Só são permitidos caracteres numéricos."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicador de progresso de introdução do código"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ de %@ dígitos introduzidos"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Não se lembra do código?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Não foi possível adicionar elemento do Porta‑chaves."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Não"; "BOOL_YES" = "Sim"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "pés"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Toque para responder"; "NULL_ANSWER" = "Selecione uma resposta"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Guardar para depois"; "BUTTON_OPTION_DISCARD" = "Não usar os resultados"; "BUTTON_OPTION_STOP_TASK" = "Terminar tarefa"; +"BUTTON_SAVE" = "Guardar"; +"BUTTON_CLEAR_ANSWER" = "Limpar resposta"; +"BUTTON_READ_ONLY_MODE" = "Esta resposta não pode ser alterada."; /* General active tasks. */ -"COUNTDOWN_LABEL" = "Iniciar teste daqui a"; +"COUNTDOWN_LABEL" = "Iniciar exercício daqui a"; "TASK_COMPLETE_TITLE" = "Exercício concluído"; "TASK_COMPLETE_TEXT" = "Os seus dados serão analisados e receberá um aviso quando os resultados estiverem disponíveis."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Faltam %@ segundos."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturar imagem"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Não foi especificado nenhum diretório de saída para as imagens capturadas."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Não foi possível guardar a imagem capturada."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Iniciar gravação"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Parar gravação"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Voltar a filmar"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distância (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Dê meia‑volta e ande de volta ao ponto de partida."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Dê até %ld passos em linha reta."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Escolha um sítio onde possa andar em segurança, para trás e para frente em linha reta. Tente andar sem parar, dando a volta no final do percurso como se estivesse a andar à volta de um cone.\n\nDepois, ser‑lhe‑à pedido que se vire, dando uma volta completa, e que permaneça imóvel, com os braços ao logo do corpo e os pés afastados à largura dos ombros."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Quando estiver pronto(a), toque em Começar.\nDepois, coloque o telefone no bolso ou na carteira e siga as instruções."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Ande em linha reta, para trás e para frente, durante %@. Ande normalmente."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Rode dando uma volta completa e, depois, permaneça imóvel durante %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Concluiu este exercício."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Velocidade de toque"; +"TAPPING_TASK_TITLE_RIGHT" = "Mão direita"; +"TAPPING_TASK_TITLE_LEFT" = "Mão esquerda"; "TAPPING_INTRO_TEXT" = "Este exercício mede a sua velocidade de toque."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Coloque o telefone numa superfície plana. Verá aparecer no ecrã dois botões durante %@. Com dois dedos da mesma mão, toque alternadamente nos botões o mais depressa que puder."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Coloque o telefone numa superfície plana."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Com dois dedos da mesma mão, toque alternadamente nos botões no ecrã."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Com dois dedos da mão direita, toque alternadamente nos botões no ecrã."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Com dois dedos da mão esquerda, toque alternadamente nos botões no ecrã."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Agora repita o mesmo teste com a mão direita."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Agora repita o mesmo teste com a mão esquerda."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Toque com um dedo e depois com o outro. Tente fazer com que os toques sejam o mais regulares possível. Continue a tocar durante %@."; "TAPPING_CALL_TO_ACTION" = "Para iniciar, toque em Começar."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Toque em Seguinte para começar."; "TAP_BUTTON_TITLE" = "Toque"; "TOTAL_TAPS_LABEL" = "Total de toques"; -"TAPPING_INSTRUCTION" = "Com dois dedos, toque nos botões o mais depressa que puder."; - +"TAPPING_INSTRUCTION" = "Com dois dedos, toque nos botões o mais regularmente que puder."; +"TAPPING_INSTRUCTION_RIGHT" = "Com a mão DIREITA, toque nos botões."; +"TAPPING_INSTRUCTION_LEFT" = "Com a mão ESQUERDA, toque nos botões."; +"TAPPING_SKIP_TITLE" = "Não testar esta mão"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voz"; @@ -241,10 +273,13 @@ "AUDIO_INTENDED_USE" = "Este exercício avalia a sua voz, gravando‑a através do microfone na parte inferior do telefone."; "AUDIO_TOO_LOUD_LABEL" = "Demasiado alto"; "AUDIO_GENERIC_ERROR_LABEL" = "Não é possível gravar áudio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Aguarde enquanto verificamos o nível de ruído de fundo."; +"AUDIO_TOO_LOUD_MESSAGE" = "O nível de ruído ambiente é demasiado elevado para gravar a sua voz. Desloque‑se para um local menos ruidoso e volte a tentar."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Quando estiver pronto(a), toque em Seguinte."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometria de tom"; -"TONE_AUDIOMETRY_INTENDED_USE" = "Esta atividade mede a sua capacidade de ouvir sons diferentes."; +"TONE_AUDIOMETRY_INTENDED_USE" = "Este exercício mede a sua capacidade de ouvir sons diferentes."; "TONE_AUDIOMETRY_INTRO_TEXT" = "Antes de começar, ligue os auscultadores e coloque-os na cabeça."; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "Para iniciar, toque em Começar."; "TONE_AUDIOMETRY_PREP_TEXT" = "Deve ouvir um som agora. Ajuste o volume usando os controlos na parte lateral do dispositivo.\n\nToque no botão quando estiver pronto para começar."; @@ -277,7 +312,7 @@ /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "Tempo de reação"; -"REACTION_TIME_TASK_INTENDED_USE" = "Esta atividade avalia o seu tempo de resposta a uma pista visual."; +"REACTION_TIME_TASK_INTENDED_USE" = "Este exercício avalia o seu tempo de resposta a uma pista visual."; "REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Agite o dispositivo em qualquer direção assim que o ponto azul aparecer no ecrã. Ser-lhe-á pedido para fazer isto %D vezes."; "REACTION_TIME_TASK_CALL_TO_ACTION" = "Para iniciar, toque em Começar."; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "Tentativa %@ de %@"; @@ -294,7 +329,7 @@ /* Timed walk active task. */ "TIMED_WALK_TITLE" = "Caminhada temporizada"; -"TIMED_WALK_INTRO_DETAIL" = "Esta atividade mede a função das suas extremidades inferiores."; +"TIMED_WALK_INTRO_DETAIL" = "Este exercício mede a função das suas extremidades inferiores."; "TIMED_WALK_INTRO_2_TEXT_%@" = "Encontre um lugar, preferencialmente no exterior, onde possa caminhar cerca de %@ em linha reta o mais rapidamente possível, mas em segurança. Não abrande até ultrapassar a meta."; "TIMED_WALK_INTRO_2_DETAIL" = "Toque em Seguinte para começar."; "TIMED_WALK_FORM_TITLE" = "Dispositivo auxiliar"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Apanhe o círculo com dois dedos."; "HOLE_PEG_TEST_TEXT_2" = "Levante os dedos para largar o círculo."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremor"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Este exercício mede o tremor das mãos em várias posições. Durante todo o exercício, é importante manter‑se confortavelmente sentado(a)."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Segure no telefone (como mostra a imagem abaixo) com a mão mais afetada."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Segure no telefone (como mostra a imagem abaixo) com a mão DIREITA."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Segure no telefone (como mostra a imagem abaixo) com a mão ESQUERDA."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Ser‑lhe‑à pedido que efetue %@, na posição sentada, com o telefone na mão."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "uma tarefa"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "duas tarefas"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "três tarefas"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "quatro tarefas"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinco tarefas"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Toque em Seguinte para continuar."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Prepare‑se para segurar no telefone no colo."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Prepare‑se para segurar no telefone no colo, com a mão ESQUERDA."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Prepare‑se para segurar no telefone no colo, com a mão DIREITA."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Continue com o telefone no colo durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Agora segure no telefone com o braço estendido à altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Agora segure no telefone com a mão ESQUERDA, com o braço estendido à altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Agora segure no telefone com a mão DIREITA, com o braço estendido à altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Continue a segurar no telefone com o braço estendido durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Agora segure no telefone à altura do ombro, com o cotovelo dobrado."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Agora, segure no telefone com a mão ESQUERDA e, com o cotovelo dobrado, levante o braço à altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Agora, segure no telefone com a mão DIREITA e, com o cotovelo dobrado, levante o braço à altura do ombro."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Continue a segurar no telefone com o cotovelo dobrado durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Agora, mantendo o cotovelo dobrado, toque repetidamente no nariz com o telefone."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Agora, com a mão ESQUERDA e mantendo o cotovelo dobrado, toque repetidamente no nariz com o telefone."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Agora, com a mão DIREITA e mantendo o cotovelo dobrado, toque repetidamente no nariz com o telefone."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Continue a tocar com o telefone no nariz durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Prepare‑se para acenar (rodando o pulso com a mão levantada)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Prepare‑se para acenar com o telefone na mão ESQUERDA (rodando o pulso com a mão levantada)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Prepare‑se para acenar com o telefone na mão DIREITA (rodando o pulso com a mão levantada)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Continue a acenar com a mão durante %ld segundos."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Agora mude o telefone para a mão ESQUERDA e passe à tarefa seguinte."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Agora mude o telefone para a mão DIREITA e passe à tarefa seguinte."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Passar à tarefa seguinte."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Exercício concluído."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Ser‑lhe‑à pedido que efetue %@, na posição sentada, primeiro com o telefone numa mão e, depois, na outra."; +"TREMOR_SKIP_LEFT_HAND" = "Não consigo fazer este exercício com a mão ESQUERDA."; +"TREMOR_SKIP_RIGHT_HAND" = "Não consigo fazer este exercício com a mão DIREITA."; +"TREMOR_SKIP_NEITHER" = "Consigo fazer este exercício com ambas as mãos."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Não foi possível criar ficheiro"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Não foi possível remover ficheiros de registo suficientes para atingir o limite."; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Pré‑visualização da captura"; "AX_IMAGE_CAPTURED_LABEL" = "Imagem capturada"; +"AX_VIDEO_CAPTURE_LABEL" = "Pré‑visualização de vídeo"; +"AX_VIDEO_CAPTURED_LABEL" = "vídeo filmado"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Impossível colocar o disco com tamanho %@ no disco com tamanho %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Destino"; "AX_TOWER_OF_HANOI_TOWER" = "Torre"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Tem disco com tamanhos %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Vazio"; -"AX_GRAPH_RANGE_FORMAT" = "Intervalo de %@ a %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Intervalo de %@ a %@"; +"AX_GRAPH_STACK_PREFIX" = "Pilha composta por"; "AX_GRAPH_AND_SEPARATOR" = " e "; "AX_GRAPH_POINT_%@" = "Ponto: %@"; diff --git a/ResearchKit/Localized/pt_PT.lproj/locversion.plist b/ResearchKit/Localized/pt_PT.lproj/locversion.plist index 0b48f52b..4e004b86 100644 --- a/ResearchKit/Localized/pt_PT.lproj/locversion.plist +++ b/ResearchKit/Localized/pt_PT.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale pt_PT LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/ro.lproj/ResearchKit.strings b/ResearchKit/Localized/ro.lproj/ResearchKit.strings index 6b193d5d..12bda8af 100644 --- a/ResearchKit/Localized/ro.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ro.lproj/ResearchKit.strings @@ -120,7 +120,7 @@ "VERIFICATION_NAV_TITLE" = "Verificare"; "VERIFICATION_STEP_TITLE" = "Verificați-vă e‑mailul"; "RESEND_EMAIL_LABEL_MESSAGE" = "Apăsați pe linkul de mai jos dacă nu ați primit un e‑mail de verificare și ați dori retrimiterea acestuia."; -"RESEND_EMAIL_BUTTON_TITLE" = "Retrimite e‑mailul de verificare"; +"RESEND_EMAIL_BUTTON_TITLE" = "Retrimiteți e‑mailul de verificare"; /* Login step */ "LOGIN_CONTINUE_BUTTON_TITLE" = "Login"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Sunt permise doar caractere numerice."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indicator de progres pentru introducerea codului"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ din %@ cifre introduse"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Ați uitat codul de acces?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Imposibil de adăugat articolul din portchei."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nu"; "BOOL_YES" = "Da"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Apăsați pentru a răspunde"; "NULL_ANSWER" = "Selectați un răspuns"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Salvați pentru mai târziu"; "BUTTON_OPTION_DISCARD" = "Abandonați rezultatele"; "BUTTON_OPTION_STOP_TASK" = "Încheiați sarcina"; +"BUTTON_SAVE" = "Salvați"; +"BUTTON_CLEAR_ANSWER" = "Degajați răspunsul"; +"BUTTON_READ_ONLY_MODE" = "Acest răspuns nu poate fi modificat."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Activitatea începe peste"; "TASK_COMPLETE_TITLE" = "Activitate finalizată"; "TASK_COMPLETE_TEXT" = "Datele dvs. vor fi analizate și veți primi o notificare atunci când rezultatele vor fi disponibile."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "timp rămas: %@ secunde."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Capturați imaginea"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Nu a fost specificat un director de ieșire pentru imaginile capturate."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Imaginea capturată nu a putut fi salvată."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Porniți înregistrarea"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Opriți înregistrarea"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Recapturați clipul video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distanță (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Întorceți-vă și mergeți înapoi la locul de pornire."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Mergeți până la %ld pași în linie dreaptă."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Găsiți un loc unde să puteți merge în siguranță pe un traseu, înainte și înapoi, în linie dreaptă. Încercați să mergeți continuu, întorcându‑vă la capătul traseului ca și cum ați ocoli un jalon.\n\nÎn continuare, vi se va solicita să vă întoarceți descriind un cerc complet, apoi să stați în repaus cu brațele întinse și picioarele depărtate la o distanță aproximativ egală cu lățimea umerilor."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Apăsați “Start” când sunteți gata să începeți.\nPuneți apoi telefonul în buzunar sau în geantă și urmați instrucțiunile audio."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Mergeți înainte și înapoi în linie dreaptă timp de %@. Mergeți așa cum o ați face‑o în mod normal."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Întoarceți‑vă descriind un cerc complet, apoi stați în repaus timp de %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Ați finalizat activitatea."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Viteză de apăsare"; +"TAPPING_TASK_TITLE_RIGHT" = "Mâna dreaptă"; +"TAPPING_TASK_TITLE_LEFT" = "Mâna stângă"; "TAPPING_INTRO_TEXT" = "Această activitate vă măsoară viteza de apăsare cu degetele."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Așezați-vă telefonul pe o suprafață plată. Pe ecran vor apărea două butoane timp de %@. Folosind două degete de la aceeași mână, apăsați pe rând butoanele cât de repede puteți."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Puneți‑vă telefonul pe o suprafață plată."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Folosiți două degete de la aceeași mână pentru a apăsa alternativ butoanele de pe ecran."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Folosiți două degete de la mâna dreaptă pentru a apăsa alternativ butoanele de pe ecran."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Folosiți două degete de la mâna stângă pentru a apăsa alternativ butoanele de pe ecran."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Acum, repetați același test folosind mâna dreaptă."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Acum, repetați același test folosind mâna stângă."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Apăsați cu un deget, apoi cu celălalt. Încercați ca apăsările să se succeadă cât regulat cu putință. Continuați să apăsați timp de %@."; "TAPPING_CALL_TO_ACTION" = "Apăsați “Start” pentru a începe."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Apăsați “Înainte” pentru a începe."; "TAP_BUTTON_TITLE" = "Apăsați"; "TOTAL_TAPS_LABEL" = "Total apăsări"; -"TAPPING_INSTRUCTION" = "Apăsați butoanele cât de repede puteți folosind două degete."; - +"TAPPING_INSTRUCTION" = "Apăsați butoanele cât de consecvent puteți folosind două degete."; +"TAPPING_INSTRUCTION_RIGHT" = "Apăsați butoanele folosind mâna DREAPTĂ."; +"TAPPING_INSTRUCTION_LEFT" = "Apăsați butoanele folosind mâna STÂNGĂ."; +"TAPPING_SKIP_TITLE" = "Omiteți această mână"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Voce"; @@ -241,11 +273,14 @@ "AUDIO_INTENDED_USE" = "Această activitate vă evaluează vocea prin înregistrarea acesteia cu microfonul din partea de jos a telefonului dvs."; "AUDIO_TOO_LOUD_LABEL" = "Prea tare"; "AUDIO_GENERIC_ERROR_LABEL" = "Imposibil de înregistrat audio"; +"AUDIO_LEVEL_CHECK_LABEL" = "Așteptați să se verifice nivel zgomotului de fundal."; +"AUDIO_TOO_LOUD_MESSAGE" = "Nivelul zgomotului ambiental este prea puternic pentru a vă înregistra vocea. Mutați‑vă într‑un loc mai liniștit și reîncercați."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Apăsați “Înainte” când sunteți gata."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Audiometrie tonală"; "TONE_AUDIOMETRY_INTENDED_USE" = "Această activitate vă măsoară capacitatea de a auzi diferite sunete."; -"TONE_AUDIOMETRY_INTRO_TEXT" = "Înainte de a începe, conectați căștile și puneți-le pe cap."; +"TONE_AUDIOMETRY_INTRO_TEXT" = "Înainte de a începe, conectați și puneți‑vă căștile."; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "Apăsați “Start” pentru a începe."; "TONE_AUDIOMETRY_PREP_TEXT" = "Ar trebui să auziți un ton acum. Reglați volumul folosind comenzile de pe partea laterală a dispozitivului.\n\nApăsați butonul când sunteți gata să începeți."; "TONE_AUDIOMETRY_INSTRUCTION" = "Apăsați butonul de fiecare dată când începeți să auziți un sunet."; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Ridicați cercul folosind două degete."; "HOLE_PEG_TEST_TEXT_2" = "Ridicați degetele pentru a elibera cercul."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Activitate referitoare la tremor"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Această activitate vă măsoară tremorul mâinilor în diverse poziții. Găsiți un loc unde să puteți sta confortabil pe durata activității."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Țineți telefonul în mâna mai afectată, ca în imaginea de mai jos."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Țineți telefonul în mâna DREAPTĂ, ca în imaginea de mai jos."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Țineți telefonul în mâna STÂNGĂ, ca în imaginea de mai jos."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Vi se va solicita să efectuați %@ stând cu telefonul în mână."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "o sarcină"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "două sarcini"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "trei sarcini"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "patru sarcini"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "cinci sarcini"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Apăsați “Înainte” pentru a continua."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Pregătiți‑vă să țineți telefonul pe genunchi."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Pregătiți‑vă să țineți telefonul pe genunchi cu mâna STÂNGĂ."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Pregătiți‑vă să țineți telefonul pe genunchi cu mâna DREAPTĂ."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Continuați să țineți telefonul pe genunchi timp de %ld secunde."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Acum, țineți telefonul cu mâna întinsă la înălțimea umărului."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Acum, țineți telefonul cu mâna STÂNGĂ întinsă la înălțimea umărului."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Acum, țineți telefonul cu mâna DREAPTĂ întinsă la înălțimea umărului."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Continuați să țineți telefonul cu mâna întinsă timp de %ld secunde."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Acum, țineți telefonul la înălțimea umărului, cu cotul îndoit."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Acum, țineți telefonul cu mâna STÂNGĂ la înălțimea umărului, cu cotul îndoit."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Acum, țineți telefonul cu mâna DREAPTĂ la înălțimea umărului, cu cotul îndoit."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Continuați să țineți telefonul cu cotul îndoit timp de %ld secunde."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Acum, ținându‑vă cotul îndoit, atingeți‑vă nasul cu telefonul în mod repetat."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Acum, ținându‑vă telefonul în mâna STÂNGĂ cu cotul îndoit, atingeți‑vă nasul cu telefonul în mod repetat."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Acum, ținându‑vă telefonul în mâna DREAPTĂ cu cotul îndoit, atingeți‑vă nasul cu telefonul în mod repetat."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Continuați să vă atingeți nasul cu telefonul timp de %ld secunde."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Pregătiți‑vă să fluturați mâna, răsucind din încheietură."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Pregătiți‑vă să fluturați mâna STÂNGĂ, ținând telefonul în aceasta și răsucind din încheietură."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Pregătiți‑vă să fluturați mâna DREAPTĂ, ținând telefonul în aceasta și răsucind din încheietură."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Continuați să fluturați mâna timp de %ld secunde."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Acum, treceți telefonul în mâna STÂNGĂ și continuați cu sarcina următoare."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Acum, treceți telefonul în mâna DREAPTĂ și continuați cu sarcina următoare."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Continuați cu sarcina următoare."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Activitate finalizată."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Vi se va solicita să efectuați %@ stând mai întâi cu telefonul într‑o mână, apoi în cealaltă."; +"TREMOR_SKIP_LEFT_HAND" = "Nu pot efectua această activitate cu mâna STÂNGĂ."; +"TREMOR_SKIP_RIGHT_HAND" = "Nu pot efectua această activitate cu mâna DREAPTĂ."; +"TREMOR_SKIP_NEITHER" = "Pot efectua această activitate cu ambele mâini."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Fișierul nu a putut fi creat"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Nu au putut fi eliminate suficiente fișiere jurnal pentru atingerea pragului admis"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Previzualizare captură"; "AX_IMAGE_CAPTURED_LABEL" = "Imagine capturată"; +"AX_VIDEO_CAPTURE_LABEL" = "Previzualizare captură video"; +"AX_VIDEO_CAPTURED_LABEL" = "Clip video capturat"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Nu se poate plasa un disc de mărimea %@ pe un disc de mărimea %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Țintă"; "AX_TOWER_OF_HANOI_TOWER" = "Turn"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Are disc de mărime %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Gol"; -"AX_GRAPH_RANGE_FORMAT" = "Interval de la %@ la %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Interval de la %@ la %@"; +"AX_GRAPH_STACK_PREFIX" = "Stiva compusă din"; "AX_GRAPH_AND_SEPARATOR" = " și "; "AX_GRAPH_POINT_%@" = "Punctul: %@"; diff --git a/ResearchKit/Localized/ro.lproj/locversion.plist b/ResearchKit/Localized/ro.lproj/locversion.plist index 6a843622..512a5013 100644 --- a/ResearchKit/Localized/ro.lproj/locversion.plist +++ b/ResearchKit/Localized/ro.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ro LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/ru.lproj/ResearchKit.strings b/ResearchKit/Localized/ru.lproj/ResearchKit.strings index 7f2e0d5c..056a3e62 100644 --- a/ResearchKit/Localized/ru.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/ru.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Можно использовать только цифры."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Индикатор хода ввода код‑пароля"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Введено цифр: %@ из %@"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Забыли код‑пароль?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Не удалось добавить объект связки ключей."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Нет"; "BOOL_YES" = "Да"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "см"; +"MEASURING_UNIT_FT" = "фт"; +"MEASURING_UNIT_IN" = "дюйм."; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Коснитесь, чтобы ответить"; "NULL_ANSWER" = "Выберите ответ"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Сохранить на потом"; "BUTTON_OPTION_DISCARD" = "Сбросить результаты"; "BUTTON_OPTION_STOP_TASK" = "Завершить"; +"BUTTON_SAVE" = "Сохранить"; +"BUTTON_CLEAR_ANSWER" = "Очистить ответ"; +"BUTTON_READ_ONLY_MODE" = "Этот ответ нельзя изменить."; /* General active tasks. */ -"COUNTDOWN_LABEL" = "Упражнение начинается через"; -"TASK_COMPLETE_TITLE" = "Упражнение завершено"; +"COUNTDOWN_LABEL" = "Задача начинается через"; +"TASK_COMPLETE_TITLE" = "Задача выполнена"; "TASK_COMPLETE_TEXT" = "Данные будут проанализированы. Вы получите уведомление, когда результаты будут готовы."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Осталось %@ с."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Захват изображения"; @@ -203,18 +213,23 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Не указана папка для сохранения полученных изображений."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Не удается сохранить полученное изображение."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Начать запись"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Остановить запись"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Снять видео еще раз"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Выносливость"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Расстояние (%@)"; "FITNESS_HEARTRATE_TITLE" = "Пульс (уд/мин)"; "FITNESS_SIT_INSTRUCTION_FORMAT" = "Сядьте поудобнее и сидите: %@."; "FITNESS_WALK_INSTRUCTION_FORMAT" = "Идите с максимальной скоростью: %@."; -"FITNESS_INTRO_TEXT_FORMAT" = "Во время этого упражнения программа следит за частотой Вашего пульса и измеряет, какое расстояние Вы можете пройти за: %1$@."; +"FITNESS_INTRO_TEXT_FORMAT" = "Во время выполнения этой задачи программа следит за частотой Вашего пульса и измеряет расстояние, которое Вы пройдете за %1$@."; "FITNESS_INTRO_2_TEXT_FORMAT" = "Идите по улице с максимальной скоростью: %1$@. После этого удобно сядьте и отдыхайте: %2$@. Коснитесь «Начать», чтобы приступить."; /* Short walk active task. */ "WALK_TASK_TITLE" = "Координация движений"; -"WALK_INTRO_TEXT" = "В этом упражнении проверяется координация движений при ходьбе и в положении стоя. Не выполняйте это упражнение, если Вы не можете передвигаться без посторонней помощи."; +"WALK_INTRO_TEXT" = "В этой задаче проверяется координация движений при ходьбе и в положении стоя. Не выполняйте эту задачу, если Вы не можете передвигаться без посторонней помощи."; "WALK_INTRO_2_TEXT_%ld" = "Найдите место, где Вы можете безопасно пройти %ld шагов по прямой линии без посторонней помощи."; "WALK_INTRO_2_DETAIL" = "Поместите телефон в карман или сумку и следуйте звуковым указаниям."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Теперь стойте спокойно: %@."; @@ -222,29 +237,49 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Развернитесь и пройдите до исходного местоположения."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Пройдите прямо %ld шагов."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Найдите место, где бы Вы могли ходить по прямой линии в обоих направлениях. Постарайтесь идти непрерывно, разворачиваясь на концах линии так, как будто обходите острый угол.\n\nЗатем Вы получите указание развернуться на 360 градусов и стоять спокойно, опустив руки вдоль тела и выставив ноги на ширине плеч."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Коснитесь «Начать», когда будете готовы приступить к выполнению задания.\nЗатем положите телефон в карман или сумку и следуйте звуковым указаниям."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Походите по прямой вперед и назад в течение %@. Идите нормальной походкой."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Развернитесь на 360 градусов и стойте спокойно %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Вы выполнили задачу."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Скорость касания"; -"TAPPING_INTRO_TEXT" = "В этом упражнении оценивается скорость касания пальцами."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Положите телефон на ровную поверхность. На экране появятся две кнопки и будут отображаться: %@. Двумя пальцами одной руки попеременно касайтесь этих кнопок как можно быстрее."; +"TAPPING_TASK_TITLE_RIGHT" = "Правая рука"; +"TAPPING_TASK_TITLE_LEFT" = "Левая рука"; +"TAPPING_INTRO_TEXT" = "В этой задаче оценивается скорость касания пальцами."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Положите телефон на ровную поверхность."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Двумя пальцами одной руки попеременно касайтесь появляющихся кнопок на экране."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Двумя пальцами правой руки попеременно касайтесь появляющихся кнопок на экране."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Двумя пальцами левой руки попеременно касайтесь появляющихся кнопок на экране."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Теперь повторите это упражнение правой рукой."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Теперь повторите это упражнение левой рукой."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Коснитесь одним пальцем, затем другим. Старайтесь, чтобы касания были максимально регулярными. Продолжайте в течение %@."; "TAPPING_CALL_TO_ACTION" = "Чтобы приступить, коснитесь «Начать»."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Чтобы начать, коснитесь «Далее»."; "TAP_BUTTON_TITLE" = "Коснитесь"; "TOTAL_TAPS_LABEL" = "Всего касаний"; -"TAPPING_INSTRUCTION" = "Касайтесь кнопок двумя пальцами как можно быстрее."; - +"TAPPING_INSTRUCTION" = "Касайтесь кнопок двумя пальцами с одинаковой скоростью."; +"TAPPING_INSTRUCTION_RIGHT" = "Касайтесь кнопок пальцами ПРАВОЙ руки."; +"TAPPING_INSTRUCTION_LEFT" = "Касайтесь кнопок пальцами ЛЕВОЙ руки."; +"TAPPING_SKIP_TITLE" = "Пропустить эту руку"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Голос"; "AUDIO_CALL_TO_ACTION" = "Чтобы приступить, коснитесь «Начать»."; "AUDIO_INSTRUCTION" = "Произносите «Ааааа» в микрофон как можно дольше."; "AUDIO_INTRO_TEXT" = "Сделайте глубокий вдох и произнесите «Ааааа» в микрофон как можно дольше. Сохраняйте такую громкость голоса, чтобы полоски звука на диаграмме оставались синими."; -"AUDIO_INTENDED_USE" = "Во время этого упражнения программа записывает Вашу речь через микрофон телефона и затем оценивает характеристики Вашего голоса."; +"AUDIO_INTENDED_USE" = "Во время выполнения этой задачи программа записывает Вашу речь через микрофон телефона и затем оценивает характеристики Вашего голоса."; "AUDIO_TOO_LOUD_LABEL" = "Слишком громко"; "AUDIO_GENERIC_ERROR_LABEL" = "Не удается записать аудио."; +"AUDIO_LEVEL_CHECK_LABEL" = "Подождите, пока устройство измерит уровень фонового шума."; +"AUDIO_TOO_LOUD_MESSAGE" = "Уровень фонового шума слишком большой и не позволяет записать Ваш голос. Найдите более тихое место и повторите попытку."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Коснитесь «Далее», когда будете готовы."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Аудиометрия"; -"TONE_AUDIOMETRY_INTENDED_USE" = "В этом упражнении оценивается Ваша способность слышать различные звуки."; +"TONE_AUDIOMETRY_INTENDED_USE" = "В этой задаче оценивается Ваша способность слышать различные звуки."; "TONE_AUDIOMETRY_INTRO_TEXT" = "Перед началом подключите наушники и наденьте их."; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "Чтобы приступить, коснитесь «Начать»."; "TONE_AUDIOMETRY_PREP_TEXT" = "Сейчас Вы услышите звук. Настройте громкость с помощью регулятора на боковой панели устройства.\n\nКоснитесь кнопки, когда будете готовы."; @@ -254,7 +289,7 @@ /* Spatial span memory active task. */ "SPATIAL_SPAN_MEMORY_TITLE" = "Пространственная память"; -"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Во время этого упражнения оцениваются возможности Вашей кратковременной пространственной памяти. Программа попросит Вас повторить последовательность, в которой подсвечиваются %@."; +"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Во время выполнения этой задачи оцениваются возможности Вашей кратковременной пространственной памяти. Программа попросит Вас повторить последовательность, в которой подсвечиваются %@."; "SPATIAL_SPAN_MEMORY_TARGET_PLURAL" = "цветы"; "SPATIAL_SPAN_MEMORY_TARGET_STANDALONE" = "цветы"; "SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "Некоторые %@ будут подсвечиваться поочередно в определенном порядке. Коснитесь этих %@ в том же порядке."; @@ -277,7 +312,7 @@ /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "Время реакции"; -"REACTION_TIME_TASK_INTENDED_USE" = "В этом упражнении измеряется время реакции на визуальный сигнал."; +"REACTION_TIME_TASK_INTENDED_USE" = "В этой задаче измеряется время реакции на визуальный сигнал."; "REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Как только на экране появится синяя точка, встряхните устройство в любом направлении. Количество повторений этого задания: %D."; "REACTION_TIME_TASK_CALL_TO_ACTION" = "Чтобы приступить, коснитесь «Начать»."; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "Попытка %@ из %@"; @@ -285,7 +320,7 @@ /* Tower of Hanoi active task */ "TOWER_OF_HANOI_TASK_TITLE" = "Ханойская башня"; -"TOWER_OF_HANOI_TASK_INTENDED_USE" = "В этом упражнении проверяется способность решать задачи."; +"TOWER_OF_HANOI_TASK_INTENDED_USE" = "В этой задаче проверяется способность решать сложные вопросы."; "TOWER_OF_HANOI_TASK_INTRO_TEXT" = "Переместите всю стопку на отмеченное цветом место за наименьшее число ходов."; "TOWER_OF_HANOI_TASK_TASK_CALL_TO_ACTION" = "Чтобы приступить, коснитесь «Начать»"; "TOWER_OF_HANOI_TASK_ACTIVE_STEP_INTRO_TEXT" = "Решить задачу"; @@ -294,7 +329,7 @@ /* Timed walk active task. */ "TIMED_WALK_TITLE" = "Ходьба на время"; -"TIMED_WALK_INTRO_DETAIL" = "В этом упражнении проверяется работоспособность нижних конечностей."; +"TIMED_WALK_INTRO_DETAIL" = "В этой задаче проверяется работоспособность нижних конечностей."; "TIMED_WALK_INTRO_2_TEXT_%@" = "Найдите место, предпочтительно снаружи, где Вы смогли бы безопасно идти %@ по прямой линии с максимальной скоростью. Не замедляйте шаг, пока не дойдете до финиша."; "TIMED_WALK_INTRO_2_DETAIL" = "Чтобы начать, коснитесь «Далее»."; "TIMED_WALK_FORM_TITLE" = "Вспомогательные приспособления"; @@ -327,7 +362,7 @@ /* Hole peg test active task. */ "HOLE_PEG_TEST_TITLE_%@" = "Тест «Вставляем %@ колышков»"; -"HOLE_PEG_TEST_INTRO_TEXT_%@" = "В этом упражнении проверяется работоспособность верхних конечностей. Вам предложат поместить колышек в лунку %@ раз(а)."; +"HOLE_PEG_TEST_INTRO_TEXT_%@" = "В этой задаче проверяется работоспособность верхних конечностей. Вам предложат поместить колышек в лунку %@ раз(а)."; "HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "Проверены будут обе руки: левая и правая.\nВам потребуется поднять колышек как можно быстрее, поместить его в лунку, а затем, повторив упражнение %@ раз(а), удалить его снова %@ раз(а)."; "HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "Проверены будут обе руки: правая и левая.\nВам потребуется поднять колышек как можно быстрее, поместить его в лунку, а затем, повторив упражнение %@ раз(а), удалить его снова %@ раз(а)."; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Поднимите колышек двумя пальцами."; "HOLE_PEG_TEST_TEXT_2" = "Приподнимите пальцы, чтобы бросить колышек."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Измерение дрожания рук"; +"TREMOR_TEST_INTRO_1_DETAIL" = "В этой задаче измеряется величина дрожания рук в различных положения. Найдите место, где бы Вы могли сидеть спокойно во время выполнения задачи."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Держите телефон рукой с более выраженными симптомами, как показано на изображении ниже."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Держите телефон ПРАВОЙ рукой, как показано на изображении ниже."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Держите телефон ЛЕВОЙ рукой, как показано на изображении ниже."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Вам нужно будет выполнить %@ в сидячем положении, держа телефон в руке."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "одно задание"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "два задания"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "три задания"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "четыре задания"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "пять заданий"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Коснитесь «Далее», чтобы продолжить."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Приготовьтесь держать телефон на коленях."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Приготовьтесь держать телефон на коленях в ЛЕВОЙ руке."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Приготовьтесь держать телефон на коленях в ПРАВОЙ руке."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Держите телефон на коленях в течение %ld с."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Теперь держите телефон в вытянутой руке на уровне плеч."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Теперь держите телефон в вытянутой ЛЕВОЙ руке на уровне плеч."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Теперь держите телефон в вытянутой ПРАВОЙ руке на уровне плеч."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Удерживайте телефон в вытянутой руке в течение %ld с."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Теперь держите телефон в согнутой в локте руке на уровне плеч."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Теперь держите телефон в согнутой в локте ЛЕВОЙ руке на уровне плеч."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Теперь держите телефон в согнутой в локте ПРАВОЙ руке на уровне плеч."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Удерживайте телефон в руке, согнутой в локте, в течение %ld с."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Теперь держите телефон в согнутой в локте руке и несколько раз коснитесь им своего носа."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Теперь держите телефон в согнутой в локте ЛЕВОЙ руке и несколько раз коснитесь им своего носа."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Теперь держите телефон в согнутой в локте ПРАВОЙ руке и несколько раз коснитесь им своего носа."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Касайтесь телефоном своего носа в течение %ld с."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Подготовьтесь выполнить махание рукой (сгибая руку в запястье)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Подготовьтесь выполнить махание ЛЕВОЙ рукой, держа в ней телефон (сгибая руку в запястье)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Подготовьтесь выполнить махание ПРАВОЙ рукой, держа в ней телефон (сгибая руку в запястье)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Продолжайте махать рукой в течение %ld с."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Теперь возьмите телефон ЛЕВОЙ рукой и перейдите к следующему заданию."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Теперь возьмите телефон ПРАВОЙ рукой и перейдите к следующему заданию."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Перейдите к следующему заданию."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Задача выполнена."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Вам нужно будет выполнить %@ в сидячем положении, держа телефон сначала в одной руке, затем в другой."; +"TREMOR_SKIP_LEFT_HAND" = "Я не могу выполнить эту задачу ЛЕВОЙ рукой."; +"TREMOR_SKIP_RIGHT_HAND" = "Я не могу выполнить эту задачу ПРАВОЙ рукой."; +"TREMOR_SKIP_NEITHER" = "Я могу выполнить эту задачу обеими руками."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Не удалось создать файл"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Не удалось удалить файлы журналов, чтобы освободить достаточно места"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Просмотр изображения"; "AX_IMAGE_CAPTURED_LABEL" = "Отснятое изображение"; +"AX_VIDEO_CAPTURE_LABEL" = "Просмотр записанного видео"; +"AX_VIDEO_CAPTURED_LABEL" = "Снятое видео"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Нельзя положить кольцо размера %@ на кольцо размера %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Цель"; "AX_TOWER_OF_HANOI_TOWER" = "Башня"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Содержит кольцо размеров: %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Пусто"; -"AX_GRAPH_RANGE_FORMAT" = "Диапазон от %@ до %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Диапазон от %@ до %@"; +"AX_GRAPH_STACK_PREFIX" = "Стопка из"; "AX_GRAPH_AND_SEPARATOR" = " и "; "AX_GRAPH_POINT_%@" = "Точка: %d"; diff --git a/ResearchKit/Localized/ru.lproj/locversion.plist b/ResearchKit/Localized/ru.lproj/locversion.plist index 47041a13..27734eb7 100644 --- a/ResearchKit/Localized/ru.lproj/locversion.plist +++ b/ResearchKit/Localized/ru.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale ru LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/sk.lproj/ResearchKit.strings b/ResearchKit/Localized/sk.lproj/ResearchKit.strings index ce61b86f..df0e2075 100644 --- a/ResearchKit/Localized/sk.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/sk.lproj/ResearchKit.strings @@ -127,20 +127,21 @@ "FORGOT_PASSWORD_BUTTON_TITLE" = "Zabudli ste heslo?"; /* Passcode step */ -"PASSCODE_PROMPT_MESSAGE" = "Zadajte heslo"; -"PASSCODE_CONFIRM_MESSAGE" = "Potvrďte heslo"; -"PASSCODE_SAVED_MESSAGE" = "Heslo uložené"; -"PASSCODE_AUTHENTICATED_MESSAGE" = "Heslo autentifikované"; -"PASSCODE_OLD_ENTRY_MESSAGE" = "Zadajte staré heslo"; -"PASSCODE_NEW_ENTRY_MESSAGE" = "Zadajte nové heslo"; -"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Potvrďte nové heslo"; -"PASSCODE_INVALID_ALERT_TITLE" = "Nesprávne heslo"; -"PASSCODE_INVALID_ALERT_MESSAGE" = "Heslá sa nezhodujú. Skúste to znovu."; +"PASSCODE_PROMPT_MESSAGE" = "Zadajte kód"; +"PASSCODE_CONFIRM_MESSAGE" = "Potvrďte kód"; +"PASSCODE_SAVED_MESSAGE" = "Kód uložený"; +"PASSCODE_AUTHENTICATED_MESSAGE" = "Kód autentifikovaný"; +"PASSCODE_OLD_ENTRY_MESSAGE" = "Zadajte starý kód"; +"PASSCODE_NEW_ENTRY_MESSAGE" = "Zadajte nový kód"; +"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Potvrďte nový kód"; +"PASSCODE_INVALID_ALERT_TITLE" = "Nesprávny kód"; +"PASSCODE_INVALID_ALERT_MESSAGE" = "Kódy sa nezhodujú. Skúste to znovu."; "PASSCODE_TOUCH_ID_MESSAGE" = "Autentifikujte sa pomocou Touch ID"; "PASSCODE_TOUCH_ID_ERROR_ALERT_TITLE" = "Chyba Touch ID"; "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Povolené sú len číselné znaky."; -"PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indikátor priebehu zadávania hesla"; +"PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Indikátor priebehu zadávania kódu"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Zadané číslice: %@ z %@"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Zabudli ste kód?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Nepodarilo sa pridať položku kľúčenky."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nie"; "BOOL_YES" = "Áno"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Klepnutím odpovedajte"; "NULL_ANSWER" = "Vyberte odpoveď"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Uložiť na neskôr"; "BUTTON_OPTION_DISCARD" = "Zahodiť výsledky"; "BUTTON_OPTION_STOP_TASK" = "Ukončiť úlohu"; +"BUTTON_SAVE" = "Uložiť"; +"BUTTON_CLEAR_ANSWER" = "Vyčistiť odpoveď"; +"BUTTON_READ_ONLY_MODE" = "Túto odpoveď nie je možné upraviť."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Aktivita sa spustí o"; "TASK_COMPLETE_TITLE" = "Aktivita dokončená"; "TASK_COMPLETE_TEXT" = "Vaše dáta budú analyzované a na výsledky budete upozornení po ich vyhodnotení."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Zostáva %@ s."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Zachytiť obrázok"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Pre zachytené obrázky nebol uvedený žiadny cieľový priečinok."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Zachytený obrázok sa nepodarilo uložiť."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Spustiť nahrávanie"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Zastaviť nahrávanie"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Znovu zachytiť video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Kondícia"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Vzdialenosť (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Otočte sa a choďte späť na miesto, kde ste začali."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Prejdite rovno %ld krokov"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Nájdite si miesto, kde môžete bezpečne chodiť po priamke tam a naspäť. Skúste kráčať plynule a na konci sa otočiť, ako keby ste obchádzali kužeľ.\n\nV ďalšom kroku budete požiadaní o otočenie na mieste o 360 stupňov a následné státie v pokoji s pripaženými rukami a chodidlami na šírku ramien."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Keď ste pripravení, klepnite na Začať.\nPotom si vložte telefón do vrecka alebo tašky a nasledujte zvukové pokyny."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Kráčajte tam a naspäť po priamke po dobu %@. Chôdza by mala byť prirodzená."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Otočte sa o 360 stupňov a ostaňte stáť po dobu %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Dokončili ste aktivitu."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Rýchlosť klepania"; +"TAPPING_TASK_TITLE_RIGHT" = "Pravá ruka"; +"TAPPING_TASK_TITLE_LEFT" = "Ľavá ruka"; "TAPPING_INTRO_TEXT" = "Táto aktivita zmeria rýchlosť klepania."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Položte telefón na rovný povrch. Na obrazovke sa na %@ zobrazia dve tlačidlá. Striedavo dvoma prstami jednej ruky na tieto tlačidlá čo najrýchlejšie klepte."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Položte telefón na vodorovnú plochu."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Pomocou dvoch prstov rovnakej ruky striedavo klepte na tlačidlá na obrazovke."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Pomocou dvoch prstov pravej ruky striedavo klepte na tlačidlá na obrazovke."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Pomocou dvoch prstov ľavej ruky striedavo klepte na tlačidlá na obrazovke."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Zopakujte tento test pomocou pravej ruky."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Zopakujte tento test pomocou ľavej ruky."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Klepnite najprv jedným prstom a potom druhým prstom. Skúste klepnutia načasovať tak, aby boli čo najviac pravidelné. Klepte po dobu %@."; "TAPPING_CALL_TO_ACTION" = "Začnite klepnutím na Začať."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Pre spustenie klepnite na Ďalej."; "TAP_BUTTON_TITLE" = "Klepnite"; "TOTAL_TAPS_LABEL" = "Celkom klepnutí"; -"TAPPING_INSTRUCTION" = "Čo najrýchlejšie klepte na tlačidlá dvomi prstami."; - +"TAPPING_INSTRUCTION" = "Pravidelne klepte na tlačidlá dvomi prstami."; +"TAPPING_INSTRUCTION_RIGHT" = "Klepte na tlačidlá pomocou PRAVEJ ruky."; +"TAPPING_INSTRUCTION_LEFT" = "Klepte na tlačidlá pomocou ĽAVEJ ruky."; +"TAPPING_SKIP_TITLE" = "Preskočiť túto ruku"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Hlas"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Táto aktivita vyhodnotí váš hlas, ktorý nahráte pomocou mikrofónu na spodku telefónu."; "AUDIO_TOO_LOUD_LABEL" = "Príliš nahlas"; "AUDIO_GENERIC_ERROR_LABEL" = "Nie je možné nahrať zvuk"; +"AUDIO_LEVEL_CHECK_LABEL" = "Počkajte na dokončenie merania úrovne hluku pozadia."; +"AUDIO_TOO_LOUD_MESSAGE" = "Úroveň hluku okolitého prostredia je príliš vysoká na nahrávanie hlasu. Presuňte sa na tichšie miesto a skúste to znovu."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Keď ste pripravení, klepnite na Ďalej."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tónová audiometria"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Zdvihnite kolík dvomi prstami."; "HOLE_PEG_TEST_TEXT_2" = "Nadvihnutím prstov pustite kolík."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Trasenie rúk"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Táto aktivita zmeria trasenie rúk v rôznych polohách. Po celý čas by ste mali pohodlne sedieť."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Držte telefón v ruke, ktorá je viac postihnutá, ako na obrázku nižšie."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Držte telefón v PRAVEJ ruke, ako na obrázku nižšie."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Držte telefón v ĽAVEJ ruke, ako na obrázku nižšie."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Budete požiadaní o vykonanie %@. Po celý čas budete sedieť s telefónom v ruke."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "jednej úlohy"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "dvoch úloh"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "troch úloh"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "štyroch úloh"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "piatich úloh"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Ak chcete pokračovať, klepnite na Ďalej."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Pripravte sa na držanie telefónu v ruke."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Pripravte sa na držanie telefónu v ĽAVEJ ruke."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Pripravte sa na držanie telefónu v PRAVEJ ruke."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Držte telefón v ruke po dobu %ld s."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Držte telefón vo vystretej ruke vo výške ramien."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Držte telefón vo vystretej ĽAVEJ ruke vo výške ramien."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Držte telefón vo vystretej PRAVEJ ruke vo výške ramien."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Držte telefón vo vystretej ruke po dobu %ld s."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Držte telefón v ruke s pokrčeným lakťom vo výške ramien."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Držte telefón v ĽAVEJ ruke s pokrčeným lakťom vo výške ramien."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Držte telefón v PRAVEJ ruke s pokrčeným lakťom vo výške ramien."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Držte telefón v ruke s pokrčeným lakťom po dobu %ld s."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "S pokrčeným lakťom sa opakovane dotýkajte nosa telefónom."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "S pokrčeným lakťom a telefónom v ĽAVEJ ruke sa opakovane dotýkajte nosa telefónom."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "S pokrčeným lakťom a telefónom v PRAVEJ ruke sa opakovane dotýkajte nosa telefónom."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Dotýkajte sa nosa telefónom po dobu %ld s."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Pripravte sa na mávanie, ako keď máva kráľovná (mávajte otáčaním zápästia)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Pripravte sa na mávanie, ako keď máva kráľovná, s telefónom v ĽAVEJ ruke (mávajte otáčaním zápästia)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Pripravte sa na mávanie, ako keď máva kráľovná, s telefónom v PRAVEJ ruke (mávajte otáčaním zápästia)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Mávajte ako kráľovná po dobu %ld s."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Uchopte telefón do ĽAVEJ ruky a pokračujte na ďalšiu úlohu."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Uchopte telefón do PRAVEJ ruky a pokračujte na ďalšiu úlohu."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Pokračujte na ďalšiu úlohu."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivita dokončená."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Budete požiadaní o vykonanie %@. Po celý čas budete sedieť s telefónom najprv v jednej a potom v druhej ruke."; +"TREMOR_SKIP_LEFT_HAND" = "Túto aktivitu nedokážem vykonať pomocou ĽAVEJ ruky."; +"TREMOR_SKIP_RIGHT_HAND" = "Túto aktivitu nedokážem vykonať pomocou PRAVEJ ruky."; +"TREMOR_SKIP_NEITHER" = "Túto aktivitu dokážem vykonať pomocou oboch rúk."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Nepodarilo sa vytvoriť súbor"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Nepodarilo odstrániť dostatok súborov záznamov pre dosiahnutie prahovej hodnoty"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Náhľad"; "AX_IMAGE_CAPTURED_LABEL" = "Zachytený obrázok"; +"AX_VIDEO_CAPTURE_LABEL" = "Náhľad zachytávaného videa"; +"AX_VIDEO_CAPTURED_LABEL" = "Zachytené video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Kotúč veľkosti %@ nie je možné umiestniť na kotúč veľkosti %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Cieľ"; "AX_TOWER_OF_HANOI_TOWER" = "Veža"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Obsahuje kotúče o veľkostiach %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Prázdne"; -"AX_GRAPH_RANGE_FORMAT" = "Rozsah od %@ do %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Rozsah od %@ do %@"; +"AX_GRAPH_STACK_PREFIX" = "Pyramída pozostáva z"; "AX_GRAPH_AND_SEPARATOR" = " a "; "AX_GRAPH_POINT_%@" = "Bod: %@"; diff --git a/ResearchKit/Localized/sk.lproj/locversion.plist b/ResearchKit/Localized/sk.lproj/locversion.plist index a24db785..da119bbb 100644 --- a/ResearchKit/Localized/sk.lproj/locversion.plist +++ b/ResearchKit/Localized/sk.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale sk LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/sv.lproj/ResearchKit.strings b/ResearchKit/Localized/sv.lproj/ResearchKit.strings index aa1e6bd1..48cbe3c0 100644 --- a/ResearchKit/Localized/sv.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/sv.lproj/ResearchKit.strings @@ -118,7 +118,7 @@ /* Verification step */ "VERIFICATION_NAV_TITLE" = "Verifiering"; -"VERIFICATION_STEP_TITLE" = "Bekräfta ditt e-brev"; +"VERIFICATION_STEP_TITLE" = "Bekräfta din e-postadress"; "RESEND_EMAIL_LABEL_MESSAGE" = "Tryck på länken nedan om du inte fick något bekräftelsebrev och vill att det skickas på nytt."; "RESEND_EMAIL_BUTTON_TITLE" = "Skicka bekräftelsebrev igen"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Endast numeriska tecken tillåts."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Förloppsindikator för angivande av lösenkod"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ av %@ siffror angivna"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Glömt lösenkoden?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Kunde inte lägga till nyckelringsobjekt."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Nej"; "BOOL_YES" = "Ja"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "fot"; +"MEASURING_UNIT_IN" = "tum"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Tryck för att svara"; "NULL_ANSWER" = "Välj ett svar"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Spara till senare"; "BUTTON_OPTION_DISCARD" = "Bortse från träffar"; "BUTTON_OPTION_STOP_TASK" = "Avsluta åtgärd"; +"BUTTON_SAVE" = "Spara"; +"BUTTON_CLEAR_ANSWER" = "Rensa svar"; +"BUTTON_READ_ONLY_MODE" = "Det här svaret kan inte ändras."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Startar aktivitet om"; "TASK_COMPLETE_TITLE" = "Aktiviteten är klar"; "TASK_COMPLETE_TEXT" = "Dina data kommer att analyseras, och du blir meddelad när resultaten är klara."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ sekunder återstår."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Spara bild"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Ingen utmatningskatalog har angetts för de sparade bilderna."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Bilden kunde inte sparas."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Starta inspelning"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Stoppa inspelning"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Spela in video igen"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Motion"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Distans (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Vänd om och gå tillbaka till utgångsplatsen."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Gå upp till %ld steg i en rak linje."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Hitta en plats där du tryggt kan gå fram och tillbaka i en rät linje. Försök att gå kontinuerligt genom att vända dig om vid slutet av linjen, som om du gick runt en kon.\nDärefter blir du ombedd att vända dig ett helt varv och sedan stå stilla med armarna längs sidorna och fötterna i ungefär axelbredd."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Tryck på Kom igång när du är redo att börja.\nPlacera sedan telefonen i en ficka eller väska och följ de talade anvisningarna."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Gå fram och tillbaka i en rät linje under %@. Gå som du vanligtvis gör."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Vänd dig ett helt varv och stå sedan stilla under %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Du har slutfört aktiviteten."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Tryckhastighet"; +"TAPPING_TASK_TITLE_RIGHT" = "Höger hand"; +"TAPPING_TASK_TITLE_LEFT" = "Vänster hand"; "TAPPING_INTRO_TEXT" = "Den här aktiviteten mäter din tryckhastighet."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Lägg telefonen på en plan yta. Två knappar kommer att synas på skärmen under %@. Använd två fingrar på samma hand till att omväxlande trycka på knapparna så fort du kan."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Lägg telefonen på en slät yta."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Använd två fingrar på samma hand till att omväxlande trycka på knapparna på skärmen."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Använd två fingrar på högra handen till att omväxlande trycka på knapparna på skärmen."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Använd två fingrar på vänstra handen till att omväxlande trycka på knapparna på skärmen."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Nu upprepar du samma test med högra handen."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Nu upprepar du samma test med vänstra handen."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tryck med ett finger och sedan det andra. Försök att trycka i en så jämn takt som möjligt. Fortsätt trycka under %@."; "TAPPING_CALL_TO_ACTION" = "Tryck på Kom igång för att börja."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Tryck på Nästa för att börja."; "TAP_BUTTON_TITLE" = "Tryck"; "TOTAL_TAPS_LABEL" = "Totalt antal tryckningar"; -"TAPPING_INSTRUCTION" = "Tryck på knapparna så fort du kan med två fingrar."; - +"TAPPING_INSTRUCTION" = "Tryck på knapparna så konsekvent du kan med två fingrar."; +"TAPPING_INSTRUCTION_RIGHT" = "Tryck på knapparna med HÖGRA handen."; +"TAPPING_INSTRUCTION_LEFT" = "Tryck på knapparna med VÄNSTRA handen."; +"TAPPING_SKIP_TITLE" = "Hoppa över den här handen"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Röst"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Den här aktiviteten utvärderar din röst genom att spela in den med mikrofonen i nederkanten av telefonen."; "AUDIO_TOO_LOUD_LABEL" = "För högt"; "AUDIO_GENERIC_ERROR_LABEL" = "Kan inte spela in ljud"; +"AUDIO_LEVEL_CHECK_LABEL" = "Vänta medan vi kontrollerar ljudnivån på bakgrundsbullret."; +"AUDIO_TOO_LOUD_MESSAGE" = "Bakgrundsbullret är för högt för att spela in din röst. Gå någonstans tystare och försök igen."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Tryck på Nästa när du är redo."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Tonaudiometri"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Lyft upp pinnen med två fingrar."; "HOLE_PEG_TEST_TEXT_2" = "Släpp pinnen genom att lyfta på fingrarna."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremoraktivitet"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Den här aktiviteten mäter darrningarna i dina händer i olika positioner. Hitta en plats där du kan sitta bekvämt under hela den här aktiviteten."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Håll telefonen i den mer påverkade handen enligt bilden nedan."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Håll telefonen i den HÖGRA handen enligt bilden nedan."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Håll telefonen i den VÄNSTRA handen enligt bilden nedan."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Du blir ombedd att utföra %@ medan du sitter med telefonen i handen."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "en åtgärd"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "två åtgärder"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "tre åtgärder"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "fyra åtgärder"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "fem åtgärder"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Tryck på nästa för att fortsätta."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Förbered dig på att hålla telefonen i knät."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Förbered dig på att hålla telefonen i knät med den VÄNSTRA handen."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Förbered dig på att hålla telefonen i knät med den HÖGRA handen."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Fortsätt hålla telefonen i knät under %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Håll nu telefonen med handen utsträckt i axelhöjd."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Håll nu telefonen med den VÄNSTRA handen utsträckt i axelhöjd."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Håll nu telefonen med den HÖGRA handen utsträckt i axelhöjd."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Fortsätt hålla telefonen med handen utsträckt under %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Håll nu telefonen i axelhöjd med armbågen böjd."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Håll nu telefonen med den VÄNSTRA handen i axelhöjd med armbågen böjd."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Håll nu telefonen med den HÖGRA handen i axelhöjd med armbågen böjd."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Fortsätt hålla telefonen med armbågen böjd under %ld sekunder"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Nu ska du hålla armbågen böjd och röra vid näsan med telefonen flera gånger."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Nu ska du hålla armbågen böjd med telefonen i den VÄNSTRA handen och röra vid näsan med telefonen flera gånger."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Nu ska du hålla armbågen böjd med telefonen i den HÖGRA handen och röra vid näsan med telefonen flera gånger."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Fortsätt röra vid näsan med telefonen under %ld sekunder"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Förbered dig på att vinka kungligt (vinka genom att vrida på handleden)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Förbered dig på att vinka kungligt med telefonen i den VÄNSTRA handen (vinka genom att vrida på handleden)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Förbered dig på att vinka kungligt med telefonen i den HÖGRA handen (vinka genom att vrida på handleden)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Fortsätt utföra en kunglig vinkning under %ld sekunder."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Flytta nu telefonen till den VÄNSTRA handen och fortsätt med nästa åtgärd."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Flytta nu telefonen till den HÖGRA handen och fortsätt med nästa åtgärd."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Fortsätt till nästa åtgärd."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktiviteten är klar."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Du blir ombedd att utföra %@ medan du sitter med telefonen i ena handen, och sedan en gång till med den andra handen."; +"TREMOR_SKIP_LEFT_HAND" = "Jag kan inte utföra den här aktiviteten med VÄNSTRA handen."; +"TREMOR_SKIP_RIGHT_HAND" = "Jag kan inte utföra den här aktiviteten med HÖGRA handen."; +"TREMOR_SKIP_NEITHER" = "Jag kan utföra den här aktiviteten med båda händerna."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Kunde inte skapa fil"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Kunde inte ta bort tillräckligt många loggfiler för att nå tröskelvärdet"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Spara förhandsvisning"; "AX_IMAGE_CAPTURED_LABEL" = "Sparad bild"; +"AX_VIDEO_CAPTURE_LABEL" = "Förhandsvisning av videoinspelning"; +"AX_VIDEO_CAPTURED_LABEL" = "Inspelad video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Ka inte placera skivan med storleken %@ på skivan med storleken %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Mål"; "AX_TOWER_OF_HANOI_TOWER" = "Torn"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Har skivor med storlekarna %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Tomt"; -"AX_GRAPH_RANGE_FORMAT" = "Intervall från %@ till %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Intervall från %@ till %@"; +"AX_GRAPH_STACK_PREFIX" = "Trave som består av"; "AX_GRAPH_AND_SEPARATOR" = " och "; "AX_GRAPH_POINT_%@" = "Punkt: %@"; diff --git a/ResearchKit/Localized/sv.lproj/locversion.plist b/ResearchKit/Localized/sv.lproj/locversion.plist index 67178111..1da155dc 100644 --- a/ResearchKit/Localized/sv.lproj/locversion.plist +++ b/ResearchKit/Localized/sv.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale sv LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/th.lproj/ResearchKit.strings b/ResearchKit/Localized/th.lproj/ResearchKit.strings index 1945a557..c5c9fb1c 100644 --- a/ResearchKit/Localized/th.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/th.lproj/ResearchKit.strings @@ -88,7 +88,7 @@ /* Alerts for invalid location coordinates */ "LOCATION_QUESTION_PLACEHOLDER" = "ป้อนที่อยู่"; -"LOCATION_ERROR_TITLE" = "ไม่สามารถหาที่อยู่ที่กำหนดได้"; +"LOCATION_ERROR_TITLE" = "ไม่สามารถหาที่อยู่ที่ระบุได้"; "LOCATION_ERROR_MESSAGE_LOCATION_UNKNOWN" = "ไม่สามารถหาตำแหน่งที่ตั้งปัจจุบันของคุณ กรุณาป้อนที่อยู่หรือไปอยู่ในที่ที่มีสัญญาณ GPS ที่ดีกว่านี้หากเป็นไปได้"; "LOCATION_ERROR_MESSAGE_DENIED" = "การเข้าถึงบริการหาตำแหน่งที่ตั้งถูกปฏิเสธ กรุณาอนุญาตให้แอพนี้ใช้บริการหาตำแหน่งที่ตั้งได้ผ่านทางการตั้งค่า"; "LOCATION_ERROR_GEOCODE" = "ไม่มีผลการค้นหาสำหรับที่อยู่ที่ป้อน กรุณาตรวจสอบให้แน่ใจว่าที่อยู่ถูกต้อง"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "เฉพาะตัวเลขเท่านั้น"; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "สัญลักษณ์แสดงว่ากำลังป้อนรหัสผ่านตัวเลขอยู่"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "ตัวเลขที่ป้อนหลักที่ %@ จาก %@ หลัก"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "ลืมรหัสหรือไม่"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "ไม่สามารถเพิ่มรายการในพวงกุญแจ"; @@ -167,6 +168,11 @@ "BOOL_NO" = "ไม่"; "BOOL_YES" = "ใช่"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "ซม."; +"MEASURING_UNIT_FT" = "ฟุต"; +"MEASURING_UNIT_IN" = "นิ้ว"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "แตะเพื่อตอบ"; "NULL_ANSWER" = "เลือกคำตอบ"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "บันทึกไว้ใช้ภายหลัง"; "BUTTON_OPTION_DISCARD" = "ละทิ้งผลลัพธ์"; "BUTTON_OPTION_STOP_TASK" = "สิ้นสุดงาน"; +"BUTTON_SAVE" = "บันทึก"; +"BUTTON_CLEAR_ANSWER" = "ล้างคำตอบ"; +"BUTTON_READ_ONLY_MODE" = "ไม่สามารถแก้ไขคำตอบนี้ได้"; /* General active tasks. */ "COUNTDOWN_LABEL" = "กำลังจะเริ่มกิจกรรมใน"; "TASK_COMPLETE_TITLE" = "กิจกรรมเสร็จสมบูรณ์"; "TASK_COMPLETE_TEXT" = "ข้อมูลของคุณจะได้รับการวินิจฉัยและคุณจะได้รับแจ้งเมื่อได้ผลลัพธ์ของคุณแล้ว"; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "เหลืออีก %@ วินาที"; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "จับภาพ"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "ไม่ได้ระบุสารบบผลลัพธ์ไว้สำหรับรูปภาพที่จับภาพ"; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "รูปภาพที่จับภาพไว้บันทึกไม่ได้"; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "เริ่มอัด"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "หยุดอัด"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "ถ่ายวิดีโออีกครั้ง"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "ฟิตเนส"; "FITNESS_DISTANCE_TITLE_FORMAT" = "ระยะทาง (%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "หันหลัง แล้วเดินกลับไปจุดเริ่มต้น"; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "เดินตรงขึ้นไป %ld ก้าว"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "หาสถานที่ที่คุณสามารถเดินไปมาเป็นเส้นตรงได้อย่างปลอดภัย ให้ลองเดินไปเรื่อยๆ จนสุดทางแล้วเดินกลับ เสมือนคุณเดินวนรอบกรวย\n\nจากนั้นระบบจะแนะนำให้คุณกลับหลังหัน แล้วยืนนิ่งๆ โดยแนบแขนไว้ข้างลำตัวและวางเท้าให้ห่างกันเท่ากับความกว้างของหัวไหล่"; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "แตะเริ่มต้น เมื่อคุณพร้อมที่จะเริ่มใช้งาน\nจากนั้นใส่โทรศัพท์ของคุณไว้ในกระเป๋ากางเกงหรือกระเป๋าถือ แล้วทำตามคำแนะนำด้วยเสียง"; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "เดินไปมาเป็นเส้นตรงนาน %@ โดยให้คุณเดินตามปกติ"; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "กลับหลังหันแล้วยืนนิ่งๆ นาน %@"; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "คุณทำกิจกรรมเสร็จสมบูรณ์แล้ว"; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "ความเร็วของการแตะ"; +"TAPPING_TASK_TITLE_RIGHT" = "มือขวา"; +"TAPPING_TASK_TITLE_LEFT" = "มือซ้าย"; "TAPPING_INTRO_TEXT" = "กิจกรรมนี้จะวัดความเร็วในการแตะของคุณ"; -"TAPPING_INTRO_TEXT_2_FORMAT" = "วางโทรศัพท์ของคุณไว้บนพื้นผิวที่ราบเรียบ ปุ่มสองปุ่มจะปรากฏบนหน้าจอของคุณเป็นเวลา %@ ใช้สองนิ้วจากมือข้างเดียวกันแตะสลับกันที่ปุ่มที่ปรากฏขึ้นให้เร็วที่สุดเท่าที่จะทำได้"; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "วางโทรศัพท์ของคุณไว้บนพื้นผิวที่ราบเรียบ"; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "ใช้นิ้วมือข้างเดียวกันสองนิ้วแตะสลับกันที่ปุ่มบนหน้าจอ"; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "ใช้นิ้วมือข้างขวาสองนิ้วแตะสลับกันที่ปุ่มบนหน้าจอ"; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "ใช้นิ้วมือข้างซ้ายสองนิ้วแตะสลับกันที่ปุ่มบนหน้าจอ"; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "ตอนนี้ให้ทดสอบแบบเดียวกันซ้ำอีกครั้งโดยใช้มือขวา"; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "ตอนนี้ให้ทดสอบแบบเดียวกันซ้ำอีกครั้งโดยใช้มือซ้าย"; +"TAPPING_INTRO_TEXT_2_FORMAT" = "แตะหนึ่งนิ้ว แล้วตามด้วยอีกนิ้ว ลองจับเวลาการแตะของคุณโดยให้มีจังหวะเท่ากันมากที่สุด แตะต่อไปเรื่อยๆ เป็นเวลา %@"; "TAPPING_CALL_TO_ACTION" = "แตะเริ่มต้นใช้งานเพื่อเริ่ม"; +"TAPPING_CALL_TO_ACTION_NEXT" = "แตะถัดไปเพื่อเริ่ม"; "TAP_BUTTON_TITLE" = "แตะ"; "TOTAL_TAPS_LABEL" = "การแตะทั้งหมด"; -"TAPPING_INSTRUCTION" = "แตะปุ่มโดยใช้สองนิ้วให้เร็วที่สุดเท่าที่จะทำได้"; - +"TAPPING_INSTRUCTION" = "ใช้สองนิ้วแตะปุ่มโดยลงน้ำหนักให้สม่ำเสมอที่สุดเท่าที่จะทำได้"; +"TAPPING_INSTRUCTION_RIGHT" = "ใช้มือขวาแตะปุ่ม"; +"TAPPING_INSTRUCTION_LEFT" = "ใช้มือซ้ายแตะปุ่ม"; +"TAPPING_SKIP_TITLE" = "ข้ามมือข้างนี้"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "เสียง"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "กิจกรรมนี้จะประเมินเสียงของคุณโดยใช้ไมโครโฟนที่อยู่ด้านล่างสุดของโทรศัพท์ของคุณบันทึกเสียงคุณไว้"; "AUDIO_TOO_LOUD_LABEL" = "ดังเกินไป"; "AUDIO_GENERIC_ERROR_LABEL" = "ไม่สามารถบันทึกเสียง"; +"AUDIO_LEVEL_CHECK_LABEL" = "โปรดรอในระหว่างที่เราตรวจสอบระดับเสียงรบกวนรอบข้าง"; +"AUDIO_TOO_LOUD_MESSAGE" = "ระดับเสียงแวดล้อมดังเกินกว่าที่จะอัดเสียงของคุณได้ โปรดย้ายไปอยู่บริเวณที่มีเสียงเบากว่านี้แล้วลองอีกครั้ง"; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "แตะถัดไปเมื่อพร้อม"; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "การตรวจวัดการได้ยินเสียง"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "ใช้นิ้วสองนิ้วหยิบหมุด"; "HOLE_PEG_TEST_TEXT_2" = "ปล่อยนิ้วเพื่อปล่อยหมุด"; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "กิจกรรมวัดอาการสั่น"; +"TREMOR_TEST_INTRO_1_DETAIL" = "กิจกรรมนี้เป็นตัววัดอาการสั่นของมือคุณในอิริยาบทต่างๆ โปรดหาสถานที่ที่คุณสามารถนั่งได้อย่างสบายๆ ในระหว่างที่ทำกิจกรรมนี้"; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "ถือโทรศัพท์ไว้ในมือข้างที่มีอาการสั่นมากกว่าตามที่แสดงในรูปภาพด้านล่าง"; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "ถือโทรศัพท์ไว้ในมือขวาตามที่แสดงในรูปภาพด้านล่าง"; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "ถือโทรศัพท์ไว้ในมือซ้ายตามที่แสดงในรูปภาพด้านล่าง"; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "ระบบจะขอให้คุณทำ%@ในระหว่างที่นั่งถือโทรศัพท์ไว้ในมือ"; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "หนึ่งบททดสอบ"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "สองบททดสอบ"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "สามบททดสอบ"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "สี่บททดสอบ"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "ห้าบททดสอบ"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "แตะถัดไปเพื่อทำต่อ"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "เตรียมถือโทรศัพท์ของคุณไว้บนตัก"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "เตรียมถือโทรศัพท์ของคุณไว้บนตักโดยใช้มือซ้าย"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "เตรียมถือโทรศัพท์ของคุณไว้บนตักโดยใช้มือขวา"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "ถือโทรศัพท์ของคุณไว้นิ่งๆ บนตักนาน %ld วินาที"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "ตอนนี้ให้วางโทรศัพท์ของคุณบนฝ่ามือแล้วถือไว้นิ่งๆ ที่ความสูงระดับไหล่"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "ตอนนี้ให้วางโทรศัพท์ของคุณบนฝ่ามือข้างซ้ายแล้วถือไว้นิ่งๆ ที่ความสูงระดับไหล่"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "ตอนนี้ให้วางโทรศัพท์ของคุณบนฝ่ามือข้างขวาแล้วถือไว้นิ่งๆ ที่ความสูงระดับไหล่"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "วางโทรศัพท์ของคุณบนฝ่ามือแล้วถือไว้นิ่งๆ นาน %ld วินาที"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "ตอนนี้ให้ถือโทรศัพท์ที่ความสูงระดับไหล่โดยงอข้อศอกของคุณไว้"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "ตอนนี้ให้ใช้มือซ้ายถือโทรศัพท์ที่ความสูงระดับไหล่โดยงอข้อศอกของคุณไว้"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "ตอนนี้ให้ใช้มือขวาถือโทรศัพท์ที่ความสูงระดับไหล่โดยงอข้อศอกของคุณไว้"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "ถือโทรศัพท์ของคุณไว้นิ่งๆ โดยงอข้อศอกนาน %ld วินาที"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "ตอนนี้ให้งอข้อศอกของคุณไว้นิ่งๆ แล้วเอาโทรศัพท์มาแตะที่จมูกแบบสลับไปมาซ้ำๆ"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "ตอนนี้ให้ใช้มือซ้ายถือโทรศัพท์และงอข้อศอกของคุณไว้นิ่งๆ แล้วเอาโทรศัพท์มาแตะที่จมูกแบบสลับไปมาซ้ำๆ"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "ตอนนี้ให้ใช้มือขวาถือโทรศัพท์และงอข้อศอกของคุณไว้นิ่งๆ แล้วเอาโทรศัพท์มาแตะที่จมูกแบบสลับไปมาซ้ำๆ"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "เอาโทรศัพท์ของคุณมาแตะที่จมูกแบบสลับไปมานาน %ld วินาที"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "เตรียมทำท่าโบกมือเบาๆ (โบกมือโดยขยับแค่ข้อมือ)"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "เตรียมทำท่าโบกมือเบาๆ โดยใช้มือซ้ายที่ถือโทรศัพท์ไว้ (โบกมือโดยขยับแค่ข้อมือ)"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "เตรียมทำท่าโบกมือเบาๆ โดยใช้มือขวาที่ถือโทรศัพท์ไว้ (โบกมือโดยขยับแค่ข้อมือ)"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "ทำท่าโบกมือเบาๆ นาน %ld วินาที"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "ตอนนี้ให้สลับไปใช้มือซ้ายถือโทรศัพท์แล้วทำบททดสอบถัดไปต่อ"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "ตอนนี้ให้สลับไปใช้มือขวาถือโทรศัพท์แล้วทำบททดสอบถัดไปต่อ"; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "ทำบททดสอบถัดไปต่อ"; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "กิจกรรมเสร็จสมบูรณ์แล้ว"; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "ระบบจะขอให้คุณทำ%@ในระหว่างที่นั่งถือโทรศัพท์ไว้ในมือข้างหนึ่ง แล้วเปลี่ยนไปถือในมืออีกข้างหนึ่ง"; +"TREMOR_SKIP_LEFT_HAND" = "ฉันไม่สามารถทำกิจกรรมนี้ได้โดยใช้มือซ้าย"; +"TREMOR_SKIP_RIGHT_HAND" = "ฉันไม่สามารถทำกิจกรรมนี้ได้โดยใช้มือขวา"; +"TREMOR_SKIP_NEITHER" = "ฉันสามารถทำกิจกรรมนี้ได้โดยใช้มือทั้งสองข้าง"; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "สร้างไฟล์ไม่ได้"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "ไม่สามารถเอาไฟล์บันทึกออกให้เพียงพอกับค่าที่กำหนด"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "แสดงตัวอย่างการเก็บภาพ"; "AX_IMAGE_CAPTURED_LABEL" = "รูปภาพที่จับภาพ"; +"AX_VIDEO_CAPTURE_LABEL" = "แสดงตัวอย่างภาพถ่ายวิดีโอ"; +"AX_VIDEO_CAPTURED_LABEL" = "วิดีโอที่ถ่ายไว้"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "ไม่สามารถวางจานที่มีขนาด %@ บนจานที่มีขนาด %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "เป้าหมาย"; "AX_TOWER_OF_HANOI_TOWER" = "หอคอย"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "มีจานที่มีขนาด %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "ว่างเปล่า"; -"AX_GRAPH_RANGE_FORMAT" = "ช่วงตั้งแต่ %@ ถึง %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "ช่วงตั้งแต่ %@ ถึง %@"; +"AX_GRAPH_STACK_PREFIX" = "สแต็คประกอบด้วย"; "AX_GRAPH_AND_SEPARATOR" = " และ "; "AX_GRAPH_POINT_%@" = "จุด: %@"; diff --git a/ResearchKit/Localized/th.lproj/locversion.plist b/ResearchKit/Localized/th.lproj/locversion.plist index 9e91c5c7..5d10170b 100644 --- a/ResearchKit/Localized/th.lproj/locversion.plist +++ b/ResearchKit/Localized/th.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale th LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/tr.lproj/ResearchKit.strings b/ResearchKit/Localized/tr.lproj/ResearchKit.strings index cbf517f8..0ada151c 100644 --- a/ResearchKit/Localized/tr.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/tr.lproj/ResearchKit.strings @@ -120,7 +120,7 @@ "VERIFICATION_NAV_TITLE" = "Doğrulama"; "VERIFICATION_STEP_TITLE" = "E-postanızı doğrulayın"; "RESEND_EMAIL_LABEL_MESSAGE" = "Doğrulama e-postası almadıysanız ve yeniden gönderilmesini istiyorsanız, lütfen aşağıdaki bağlantıya dokunun."; -"RESEND_EMAIL_BUTTON_TITLE" = "Doğrulama E-postasını Yeniden Gönder"; +"RESEND_EMAIL_BUTTON_TITLE" = "Doğrulamayı Yeniden E-postala"; /* Login step */ "LOGIN_CONTINUE_BUTTON_TITLE" = "Oturum Aç"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Yalnızca sayısal karakterlere izin veriliyor."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Parola giriş ilerleme göstergesi"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "%@ / %@ basamak girildi"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Parolayı mı Unuttunuz?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Anahtar zinciri öğesi eklenemedi."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Hayır"; "BOOL_YES" = "Evet"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "fit"; +"MEASURING_UNIT_IN" = "inç"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Yanıtlamak için dokunun"; "NULL_ANSWER" = "Bir yanıt seçin"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Sonrası İçin Kaydet"; "BUTTON_OPTION_DISCARD" = "Sonuçları At"; "BUTTON_OPTION_STOP_TASK" = "Görevi Bitir"; +"BUTTON_SAVE" = "Kaydet"; +"BUTTON_CLEAR_ANSWER" = "Yanıtı sil"; +"BUTTON_READ_ONLY_MODE" = "Bu yanıt değiştirilemiyor."; /* General active tasks. */ -"COUNTDOWN_LABEL" = "Etkinlik başlatılıyor"; -"TASK_COMPLETE_TITLE" = "Etkinlik Tamamlandı"; +"COUNTDOWN_LABEL" = "Aktivite başlatılıyor"; +"TASK_COMPLETE_TITLE" = "Aktivite Tamamlandı"; "TASK_COMPLETE_TEXT" = "Verileriniz incelenecek ve sonuçlarınız hazır olduğunuzda size haber verilecektir."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "%@ saniye kaldı."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Görüntü Yakala"; @@ -203,18 +213,23 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Yakalanan görüntülerin kaydedileceği bir dizin belirtilmemiş."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Yakalanan görüntü kaydedilemedi."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Kaydı Başlat"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Kaydı Durdur"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Videoyu Yeniden Yakala"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Fitness"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Mesafe (%@)"; "FITNESS_HEARTRATE_TITLE" = "Kalp Atış Hızı (vuruş/dk)"; "FITNESS_SIT_INSTRUCTION_FORMAT" = "Rahat bir şekilde %@ oturun."; "FITNESS_WALK_INSTRUCTION_FORMAT" = "Yürüyebildiğiniz kadar hızlı %@ yürüyün."; -"FITNESS_INTRO_TEXT_FORMAT" = "Bu etkinlik, kalp atış hızınızı izler ve %1$@ içinde ne kadar mesafe yürüyebileceğinizi ölçer."; +"FITNESS_INTRO_TEXT_FORMAT" = "Bu aktivite, kalp atış hızınızı izler ve %1$@ içinde ne kadar mesafe yürüyebileceğinizi ölçer."; "FITNESS_INTRO_2_TEXT_FORMAT" = "Açık havada yürüyebildiğiniz en yüksek hızda %1$@ yürüyün. Bitirdiğinizde, oturun ve %2$@ rahat bir şekilde dinlenin. Başlamak için Başla’ya dokunun."; /* Short walk active task. */ "WALK_TASK_TITLE" = "Yürüyüş Tarzı ve Denge"; -"WALK_INTRO_TEXT" = "Bu etkinlik, yürürken ve ayakta dururken yürüyüş tarzınızı ve dengenizi ölçer. Yardımsız, güvenli bir şekilde yürüyemiyorsanız devam etmeyin."; +"WALK_INTRO_TEXT" = "Bu aktivite, yürürken ve ayakta dururken yürüyüş tarzınızı ve dengenizi ölçer. Yardımsız, güvenli bir şekilde yürüyemiyorsanız devam etmeyin."; "WALK_INTRO_2_TEXT_%ld" = "Düz bir çizgide yaklaşık %ld adım yardımsız, güvenli bir şekilde yürüyebileceğiniz bir yer bulun."; "WALK_INTRO_2_DETAIL" = "Telefonunuzu cebinize veya çantanıza koyun ve sesli yönergeleri izleyin."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Şimdi %@ süresince hareketsiz durun."; @@ -222,29 +237,49 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "Geriye dönün ve başladığınız yere yürüyün."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Düz bir çizgide en fazla %ld adım yürüyün."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Düz bir çizgide ileri geri güvenli bir şekilde yürüyebileceğiniz bir yer bulun. Yolunuzun sonunda geri dönüp devam ederek durmadan yürümeye çalışın.\n\nSonra tam daire etrafında dönmeniz, ardından da kollarınız yanlarda ve ayaklarınız omuz genişliğinde açık olarak hareketsiz durmanız istenecektir."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Başlamaya hazır olduğunuzda Başla’ya dokunun.\nSonra telefonunuzu cebinize veya çantanıza koyun ve sesli yönergeleri izleyin."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Düz bir çizgide ileri geri %@ yürüyün. Normal bir şekilde yürüyün."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Tam daire şeklinde dönün ve sonra %@ süresince hareketsiz durun."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Bu aktiviteyi tamamladınız."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Dokunma Hızı"; -"TAPPING_INTRO_TEXT" = "Bu etkinlik dokunma hızınızı ölçer."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Telefonunuzu düz bir yüzeye koyun. %@ süresince ekranınızda iki düğme görünecektir. Aynı elinizin iki parmağını kullanarak düğmelere dokunabildiğiniz kadar çabuk sırayla dokunun."; +"TAPPING_TASK_TITLE_RIGHT" = "Sağ El"; +"TAPPING_TASK_TITLE_LEFT" = "Sol El"; +"TAPPING_INTRO_TEXT" = "Bu aktivite dokunma hızınızı ölçer."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Telefonunuzu düz bir yüzeye koyun."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Ekrandaki düğmelere dönüşümlü olarak dokunmak için aynı elinizin iki parmağını kullanın."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Ekrandaki düğmelere dönüşümlü olarak dokunmak için sağ elinizin iki parmağını kullanın."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Ekrandaki düğmelere dönüşümlü olarak dokunmak için sol elinizin iki parmağını kullanın."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Şimdi aynı testi sağ elinizi kullanarak tekrarlayın."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Şimdi aynı testi sol elinizi kullanarak tekrarlayın."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Tek parmağınızla, sonra diğeriyle dokunun. Mümkün olduğunca eşit zaman aralıklarıyla dokunmaya çalışın. %@ süresince dokunmaya devam edin."; "TAPPING_CALL_TO_ACTION" = "Başlamak için Başla’ya dokunun."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Başlamak için İleri’ye dokunun."; "TAP_BUTTON_TITLE" = "Dokun"; "TOTAL_TAPS_LABEL" = "Toplam Dokunma"; -"TAPPING_INSTRUCTION" = "İki parmağınızı kullanarak düğmelere dokunabildiğiniz kadar çabuk dokunun."; - +"TAPPING_INSTRUCTION" = "İki parmağınızı kullanarak düğmelere dokunabildiğiniz kadar tutarlı dokunun."; +"TAPPING_INSTRUCTION_RIGHT" = "Düğmelere SAĞ elinizi kullanarak dokunun."; +"TAPPING_INSTRUCTION_LEFT" = "Düğmelere SOL elinizi kullanarak dokunun."; +"TAPPING_SKIP_TITLE" = "Bu eli atla"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Ses"; "AUDIO_CALL_TO_ACTION" = "Başlamak için Başla’ya dokunun."; "AUDIO_INSTRUCTION" = "Mikrofona, söyleyebildiğiniz kadar uzun “Aaaaa” deyin."; "AUDIO_INTRO_TEXT" = "Derin bir nefes alın ve mikrofona, söyleyebildiğiniz kadar uzun “Aaaaa” deyin. Ses çubukları mavi kalacak şekilde ses yüksekliğini sabit tutmaya çalışın."; -"AUDIO_INTENDED_USE" = "Bu etkinlik, telefonunuzun alt tarafındaki mikrofonla kayıt yaparak sesinizi değerlendirir."; +"AUDIO_INTENDED_USE" = "Bu aktivite, telefonunuzun alt tarafındaki mikrofonla kayıt yaparak sesinizi değerlendirir."; "AUDIO_TOO_LOUD_LABEL" = "Çok Yüksek"; "AUDIO_GENERIC_ERROR_LABEL" = "Ses kaydı yapılamıyor"; +"AUDIO_LEVEL_CHECK_LABEL" = "Arkaplan gürültü düzeyi denetlenirken lütfen bekleyin."; +"AUDIO_TOO_LOUD_MESSAGE" = "Ortam gürültü düzeyi sesinizi kaydedemeyecek kadar yüksek. Lütfen daha sessiz bir yere gidip yeniden deneyin."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Hazır olduğunuzda İleri’ye dokunun."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Ses Tonu Odyometrisi"; -"TONE_AUDIOMETRY_INTENDED_USE" = "Bu işlem, farklı sesleri duyabilme becerinizi ölçer."; +"TONE_AUDIOMETRY_INTENDED_USE" = "Bu aktivite, farklı sesleri duyabilme becerinizi ölçer."; "TONE_AUDIOMETRY_INTRO_TEXT" = "\nBaşlamadan önce kulaklığınızı bağlayın ve takın."; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "Başlamak için Başla’ya dokunun."; "TONE_AUDIOMETRY_PREP_TEXT" = "Bir ses duyacaksınız. Aygıtınızın yan tarafında bulunan denetimleri kullanarak ses seviyesini ayarlayın.\n\nBaşlamaya hazır olduğunuzda düğmeye dokunun."; @@ -254,7 +289,7 @@ /* Spatial span memory active task. */ "SPATIAL_SPAN_MEMORY_TITLE" = "Konumsal Bellek"; -"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Bu etkinlik, %@ görüntülerinin sırasını yinelemenizi isteyerek kısa süreli konumsal belleğinizi ölçer."; +"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Bu aktivite, %@ görüntülerinin sırasını yinelemenizi isteyerek kısa süreli konumsal belleğinizi ölçer."; "SPATIAL_SPAN_MEMORY_TARGET_PLURAL" = "çiçek"; "SPATIAL_SPAN_MEMORY_TARGET_STANDALONE" = "çiçek"; "SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "Bu %@ görüntülerinin bazıları teker teker yanacaktır. Bu %@ görüntülerine yandıkları sırada dokunun."; @@ -277,7 +312,7 @@ /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "Tepki Süresi"; -"REACTION_TIME_TASK_INTENDED_USE" = "Bu işlem, görünen bir ipucuna yanıt verebildiğiniz süreyi hesaplar."; +"REACTION_TIME_TASK_INTENDED_USE" = "Bu aktivite, görünen bir ipucuna yanıt verebildiğiniz süreyi hesaplar."; "REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Ekranda mavi nokta görünür görünmez aygıtı herhangi bir yönde hızlıca sallayın. Bunu %D kez yapmanız istenecek."; "REACTION_TIME_TASK_CALL_TO_ACTION" = "Başlamak için Başla’ya dokunun."; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "%@ / %@ Girişim"; @@ -285,7 +320,7 @@ /* Tower of Hanoi active task */ "TOWER_OF_HANOI_TASK_TITLE" = "Hanoi Kulesi"; -"TOWER_OF_HANOI_TASK_INTENDED_USE" = "Bu etkinlik bulmaca çözme becerilerinizi ölçer."; +"TOWER_OF_HANOI_TASK_INTENDED_USE" = "Bu aktivite bulmaca çözme becerilerinizi ölçer."; "TOWER_OF_HANOI_TASK_INTRO_TEXT" = "Tüm yığını, vurgulanan platforma mümkün olan en az hamlede taşıyın."; "TOWER_OF_HANOI_TASK_TASK_CALL_TO_ACTION" = "Başlamak için Başla’ya dokunun"; "TOWER_OF_HANOI_TASK_ACTIVE_STEP_INTRO_TEXT" = "Bulmacayı Çöz"; @@ -294,7 +329,7 @@ /* Timed walk active task. */ "TIMED_WALK_TITLE" = "Süreli Yürüme"; -"TIMED_WALK_INTRO_DETAIL" = "Bu etkinlik, alt ekstremite fonksiyonlarınızı ölçer."; +"TIMED_WALK_INTRO_DETAIL" = "Bu aktivite, alt ekstremite fonksiyonlarınızı ölçer."; "TIMED_WALK_INTRO_2_TEXT_%@" = "Düz bir çizgide mümkün olduğunca hızlı ama güvenli bir şekilde %@ yürüyebileceğiniz bir yer (tercihen dışarıda) bulun. Bitirme çizgisini geçene dek yavaşlamayın."; "TIMED_WALK_INTRO_2_DETAIL" = "Başlamak için İleri’ye dokunun."; "TIMED_WALK_FORM_TITLE" = "Yardımcı aygıt"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "İki parmağınızla daireyi alın."; "HOLE_PEG_TEST_TEXT_2" = "Daireyi bırakmak için parmakları kaldırın."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Tremor Aktivitesi"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Bu aktivite, çeşitli pozisyonlarda ellerinizdeki tremor düzeyini ölçer. Bu aktivite süresince rahat bir şekilde oturabileceğiniz bir yer bulun."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Telefonu aşağıdaki görüntüde gösterildiği gibi daha çok etkilenen elinizde tutun."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Telefonu aşağıdaki görüntüde gösterildiği gibi SAĞ elinizde tutun."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Telefonu aşağıdaki görüntüde gösterildiği gibi SOL elinizde tutun."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Telefonunuz elinizde otururken %@ gerçekleştirmeniz istenecektir."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "bir görev"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "iki görev"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "üç görev"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "dört görev"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "beş görev"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Devam etmek için İleri’ye dokunun."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Telefonunuzu kucağınızda tutmaya hazırlanın."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Telefonunuzu SOL elinizle kucağınızda tutmaya hazırlanın."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Telefonunuzu SAĞ elinizle kucağınızda tutmaya hazırlanın."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Telefonunuzu %ld saniye kucağınızda tutmaya devam edin."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Şimdi telefonunuzu eliniz uzatılmış olarak omuz yüksekliğinde tutun."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Şimdi telefonunuzu SOL eliniz uzatılmış olarak omuz yüksekliğinde tutun."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Şimdi telefonunuzu SAĞ eliniz uzatılmış olarak omuz yüksekliğinde tutun."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Telefonunuzu eliniz uzatılmış olarak %ld saniye tutmaya devam edin."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Şimdi telefonunuzu dirseğiniz kıvrık olarak omuz yüksekliğinde tutun."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Şimdi telefonunuzu dirseğiniz kıvrık olarak omuz yüksekliğinde SOL elinizle tutun."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Şimdi telefonunuzu dirseğiniz kıvrık olarak omuz yüksekliğinde SAĞ elinizle tutun."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Telefonunuzu dirseğiniz kıvrık olarak %ld saniye tutmaya devam edin"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Şimdi dirseğinizi kıvrık tutarak telefonunuzu burnunuza tekrar tekrar dokundurun."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Şimdi telefonunuz SOL elinizde olacak şekilde dirseğinizi kıvrık tutarak telefonunuzu burnunuza tekrar tekrar dokundurun."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Şimdi telefonunuz SAĞ elinizde olacak şekilde dirseğinizi kıvrık tutarak telefonunuzu burnunuza tekrar tekrar dokundurun."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Telefonunuzu burnunuza değdirmeye %ld saniye devam edin"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Bileğinizi çevirerek el sallamaya hazırlanın."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Telefonunuz SOL elinizde olacak şekilde bileğinizi çevirerek el sallamaya hazırlanın."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Telefonunuz SAĞ elinizde olacak şekilde bileğinizi çevirerek el sallamaya hazırlanın."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Bileğinizi çevirerek el sallamaya %ld saniye devam edin."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Şimdi telefonunuzu SOL elinize alıp bir sonraki göreve geçin."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Şimdi telefonunuzu SAĞ elinize alıp bir sonraki göreve geçin."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Bir sonraki göreve geçin."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Aktivite tamamlandı."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Telefonunuz önce bir elinizde, sonra diğer elinizde otururken %@ gerçekleştirmeniz istenecektir."; +"TREMOR_SKIP_LEFT_HAND" = "Bu aktiviteyi SOL elimle gerçekleştiremem."; +"TREMOR_SKIP_RIGHT_HAND" = "Bu aktiviteyi SAĞ elimle gerçekleştiremem."; +"TREMOR_SKIP_NEITHER" = "Bu aktiviteyi her iki elimle gerçekleştirebilirim."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Dosya yaratılamadı"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Eşiğe ulaşmaya yetecek kadar günlük dosyası silinemedi"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Yakalanan görüntü önizlemesi"; "AX_IMAGE_CAPTURED_LABEL" = "Yakalanmış görüntü"; +"AX_VIDEO_CAPTURE_LABEL" = "Video yakalama önizlemesi"; +"AX_VIDEO_CAPTURED_LABEL" = "Yakalanmış video"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "%@ büyüklüğündeki disk, %@ büyüklüğündeki diskin üzerine yerleştirilemez"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Hedef"; "AX_TOWER_OF_HANOI_TOWER" = "Kule"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "%@ büyüklüklerinde disk içeriyor"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Boş"; -"AX_GRAPH_RANGE_FORMAT" = "%@ - %@ aralığında"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "%@ - %@ aralığında"; +"AX_GRAPH_STACK_PREFIX" = "Yığın içeriği:"; "AX_GRAPH_AND_SEPARATOR" = " ve "; "AX_GRAPH_POINT_%@" = "Nokta: %@"; diff --git a/ResearchKit/Localized/tr.lproj/locversion.plist b/ResearchKit/Localized/tr.lproj/locversion.plist index c7df2a8d..d7dd484c 100644 --- a/ResearchKit/Localized/tr.lproj/locversion.plist +++ b/ResearchKit/Localized/tr.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale tr LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/uk.lproj/ResearchKit.strings b/ResearchKit/Localized/uk.lproj/ResearchKit.strings index 1728e729..672f686b 100644 --- a/ResearchKit/Localized/uk.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/uk.lproj/ResearchKit.strings @@ -42,7 +42,7 @@ "CONSENT_PAGE_NUMBER_FORMAT" = "Сторінка %1$ld із %2$ld"; /* Consent section titles. */ -"CONSENT_SECTION_WELCOME" = "Ласкаво просимо!"; +"CONSENT_SECTION_WELCOME" = "Ласкаво просимо"; "CONSENT_SECTION_DATA_GATHERING" = "Збір даних"; "CONSENT_SECTION_PRIVACY" = "Приватність"; "CONSENT_SECTION_DATA_USE" = "Використання даних"; @@ -133,7 +133,7 @@ "PASSCODE_AUTHENTICATED_MESSAGE" = "Код допуску прийнято"; "PASSCODE_OLD_ENTRY_MESSAGE" = "Введіть старий код допуску"; "PASSCODE_NEW_ENTRY_MESSAGE" = "Введіть новий код допуску"; -"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Підтвердіть свій новий код"; +"PASSCODE_CONFIRM_NEW_ENTRY_MESSAGE" = "Підтвердьте свій новий код"; "PASSCODE_INVALID_ALERT_TITLE" = "Неправильний код допуску"; "PASSCODE_INVALID_ALERT_MESSAGE" = "Незбіг кодів. Спробуйте ще раз."; "PASSCODE_TOUCH_ID_MESSAGE" = "Будь ласка, засвідчіть своїм Touch ID"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Дозволено тільки цифри."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Індикатор перебігу вводу коду допуску"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Введено: %@ із %@"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Забули код допуску?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Не вдалося додати елемент до В'язки."; @@ -155,8 +156,8 @@ "BLOOD_TYPE_AB-" = "AB(IV)-"; "BLOOD_TYPE_B+" = "B(III)+"; "BLOOD_TYPE_B-" = "B(III)-"; -"BLOOD_TYPE_O+" = "0(I)+"; -"BLOOD_TYPE_O-" = "0(I)-"; +"BLOOD_TYPE_O+" = "O(I)+"; +"BLOOD_TYPE_O-" = "O(I)-"; /* Gender values. */ "GENDER_FEMALE" = "Жіноча"; @@ -167,6 +168,11 @@ "BOOL_NO" = "Ні"; "BOOL_YES" = "Так"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "см"; +"MEASURING_UNIT_FT" = "фт"; +"MEASURING_UNIT_IN" = "дм"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Торкніть, щоб відповісти"; "NULL_ANSWER" = "Вибрати відповідь"; @@ -176,7 +182,7 @@ /* Button titles */ "BUTTON_AGREE" = "Погоджуюсь"; "BUTTON_CANCEL" = "Скасувати"; -"BUTTON_OK" = "ОК"; +"BUTTON_OK" = "OK"; "BUTTON_CLEAR" = "Очистити"; "BUTTON_DISAGREE" = "Не погоджуюсь"; "BUTTON_DONE" = "Готово"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Пізніше"; "BUTTON_OPTION_DISCARD" = "Відхилити результати"; "BUTTON_OPTION_STOP_TASK" = "Завершити завдання"; +"BUTTON_SAVE" = "Зберегти"; +"BUTTON_CLEAR_ANSWER" = "Стерти відповідь"; +"BUTTON_READ_ONLY_MODE" = "Цю відповідь неможливо змінити."; /* General active tasks. */ -"COUNTDOWN_LABEL" = "Початок операції через"; -"TASK_COMPLETE_TITLE" = "Операцію завершено"; +"COUNTDOWN_LABEL" = "Початок тесту через"; +"TASK_COMPLETE_TITLE" = "Тест завершено"; "TASK_COMPLETE_TEXT" = "Ваші дані буде проаналізовано, і ви отримаєте сповіщення, коли будуть готові результати."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Лишлось %@ секунд."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Зробити знімок"; @@ -203,49 +213,74 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Для зроблених знімків не вказано вихідного каталогу."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Не вдається зберегти зроблений знімок."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Почати запис"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Зупинити запис"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Зняти відео ще раз"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Фітнес"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Відстань (%@)"; "FITNESS_HEARTRATE_TITLE" = "Пульс (уд./хв)"; "FITNESS_SIT_INSTRUCTION_FORMAT" = "Сидіть зручно протягом %@."; "FITNESS_WALK_INSTRUCTION_FORMAT" = "Ідіть якомога швидше протягом %@."; -"FITNESS_INTRO_TEXT_FORMAT" = "Ця операція оцінює ваш серцевий ритм і обчислює, скільки ви можете пройти за %1$@."; +"FITNESS_INTRO_TEXT_FORMAT" = "Цей тест оцінює ваш серцевий ритм і обчислює, скільки ви можете пройти за %1$@."; "FITNESS_INTRO_2_TEXT_FORMAT" = "Ідіть надворі своєю найшвидшою ходою протягом %1$@. Завершивши, зручно сядьте і відпочивайте протягом %2$@. Щоб почати, торкніть «Розпочати»."; /* Short walk active task. */ "WALK_TASK_TITLE" = "Хода і рівновага"; -"WALK_INTRO_TEXT" = "Ця операція оцінює вашу ходу і рівновагу під час ходіння і стояння. Не продовжуйте, якщо ви не можете безпечно ходити без допомоги."; +"WALK_INTRO_TEXT" = "Цей тест оцінює вашу ходу і рівновагу під час ходіння і стояння. Не продовжуйте, якщо ви не можете безпечно ходити без допомоги."; "WALK_INTRO_2_TEXT_%ld" = "Знайдіть місце, де ви можете безпечно зробити без допомоги інших %ld кроків по прямій."; "WALK_INTRO_2_DETAIL" = "Покладіть свій телефон у кишеню або сумку, і виконуйте аудіоінструкції."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Тепер не рухайтесь %@."; -"WALK_STAND_INSTRUCTION_FORMAT" = "Стійте, не рухаючись, протягом %@."; +"WALK_STAND_INSTRUCTION_FORMAT" = "Не рухайтесь протягом %@."; "WALK_RETURN_INSTRUCTION_FORMAT" = "Розверніться і йдіть туди, де ви почали."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Зробіть до %ld кроків по прямій."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Знайдіть місце, де ви можете безпечно пройти по прямій уперед і назад. Спробуйте не зупинятися, коли розвертаєтесь у кінці прямої, немов обходячи уявний конус.\n\nДалі вам буде запропоновано пройти повну відстань в обидва напрямки, зупинитися і не рухатися, тримаючи руки по боках і ноги на ширині плечей."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Торкніть «Розпочати», коли ви готові.\nПотім покладіть телефон у кишеню або сумку, і виконуйте аудіоінструкції."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Ідіть по прямій уперед і назад протягом %@. Ідіть, як ви ходите зазвичай."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Пройдіть повну відстань по колу, потім зупиніться і не рухайтесь протягом %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Ви завершили виконання тесту."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Темп торкання"; -"TAPPING_INTRO_TEXT" = "Ця операція оцінює вашу швидкість торкання."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Покладіть телефон на рівну поверхню. На екрані з’являться дві кнопки для %@. Двома пальцями однієї руки по черзі торкайте кнопки якомога швидше."; +"TAPPING_TASK_TITLE_RIGHT" = "Права рука"; +"TAPPING_TASK_TITLE_LEFT" = "Ліва рука"; +"TAPPING_INTRO_TEXT" = "Цей тест оцінює вашу швидкість торкання."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Покладіть телефон на рівну поверхню."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Двома пальцями однієї руки по черзі торкайте кнопки на екрані."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Двома пальцями правої руки по черзі торкайте кнопки на екрані."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Двома пальцями лівої руки по черзі торкайте кнопки на екрані."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Тепер повторіть цей самий тест для правої руки."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Тепер повторіть цей самий тест для лівої руки."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Торкніть одним пальцем, потім іншим. Намагайтеся торкатися з якомога рівнішим інтервалом. Продовжуйте торкати протягом %@."; "TAPPING_CALL_TO_ACTION" = "Торкніть «Розпочати», щоб почати."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Торкніть «Далі», щоб почати."; "TAP_BUTTON_TITLE" = "Торкнути"; "TOTAL_TAPS_LABEL" = "Всього дотиків"; -"TAPPING_INSTRUCTION" = "Торкайте кнопки якомога швидше двома пальцями."; - +"TAPPING_INSTRUCTION" = "Торкайте кнопки двома пальцями якомога послідовніше."; +"TAPPING_INSTRUCTION_RIGHT" = "Торкайте кнопки ПРАВОЮ рукою."; +"TAPPING_INSTRUCTION_LEFT" = "Торкайте кнопки ЛІВОЮ рукою."; +"TAPPING_SKIP_TITLE" = "Минути цю руку"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Голос"; "AUDIO_CALL_TO_ACTION" = "Торкніть «Розпочати», щоб почати."; "AUDIO_INSTRUCTION" = "Вимовляйте «А-а-а-а» у мікрофон якомога довше."; "AUDIO_INTRO_TEXT" = "Зробіть глибокий подих і вимовляйте «А-а-а-а» у мікрофон якомога довше. Тримайте однакову гучність голосу, щоб смуги звуку залишалися синіми."; -"AUDIO_INTENDED_USE" = "Ця операція оцінює ваш голос, записуючи його через мікрофон внизу вашого телефону."; +"AUDIO_INTENDED_USE" = "Цей тест оцінює ваш голос, записуючи його через мікрофон внизу вашого телефону."; "AUDIO_TOO_LOUD_LABEL" = "Надто гучно"; "AUDIO_GENERIC_ERROR_LABEL" = "Не вдається записати аудіо"; +"AUDIO_LEVEL_CHECK_LABEL" = "Будь ласка, зачекайте, поки ми перевіряємо рівень фонового шуму."; +"AUDIO_TOO_LOUD_MESSAGE" = "Рівень навколишнього шуму зависокий для записування голосу. Будь ласка, повторіть спробу у тихішому місці."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Торкніть «Далі», коли ви готові."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Аудіометрія"; -"TONE_AUDIOMETRY_INTENDED_USE" = "Ця операція вимірює вашу здатність чути різні звуки."; -"TONE_AUDIOMETRY_INTRO_TEXT" = "Перед початком приєднайте і надягніть навушники."; +"TONE_AUDIOMETRY_INTENDED_USE" = "Цей тест вимірює вашу здатність чути різні звуки."; +"TONE_AUDIOMETRY_INTRO_TEXT" = "Перед початком приєднайте і надіньте навушники."; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "Торкніть «Розпочати», щоб почати."; "TONE_AUDIOMETRY_PREP_TEXT" = "Зараз ви почуєте звук. Регулюйте гучність кнопками на боці вашого пристрою.\n\nТоркніть кнопку, коли ви готові починати."; "TONE_AUDIOMETRY_INSTRUCTION" = "Торкайте кнопку щоразу, коли почуєте звук."; @@ -254,7 +289,7 @@ /* Spatial span memory active task. */ "SPATIAL_SPAN_MEMORY_TITLE" = "Просторова пам’ять"; -"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Ця операція оцінює вашу короткострокову пам’ять, коли вам потрібно повторити порядок загоряння %@."; +"SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "Цей тест оцінює вашу короткострокову пам’ять, коли вам потрібно повторити порядок загоряння %@."; "SPATIAL_SPAN_MEMORY_TARGET_PLURAL" = "квітки"; "SPATIAL_SPAN_MEMORY_TARGET_STANDALONE" = "квітки"; "SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "Деякі %@ будуть загорятися по черзі. Торкайте ці %@ у такому самому порядку загоряння."; @@ -277,7 +312,7 @@ /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "Час реакції"; -"REACTION_TIME_TASK_INTENDED_USE" = "Ця операція оцінює час, потрібний вам, щоб зреагувати на візуальну команду."; +"REACTION_TIME_TASK_INTENDED_USE" = "Цей тест оцінює час, потрібний вам, щоб зреагувати на візуальну команду."; "REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "Трясніть пристроєм в будь-який бік, щойно на екрані з’явиться синя точка. Вас попросять зробити це кілька разів: %D."; "REACTION_TIME_TASK_CALL_TO_ACTION" = "Торкніть «Розпочати», щоб почати."; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "Спроба %@ із %@"; @@ -301,7 +336,7 @@ "TIMED_WALK_FORM_TEXT" = "Вживайте однаковий допоміжний засіб для всіх тестів."; "TIMED_WALK_QUESTION_TEXT" = "Ви носите гомілкостопний біопротез?"; "TIMED_WALK_QUESTION_2_TITLE" = "Ви користуєтесь допоміжними засобами?"; -"TIMED_WALK_QUESTION_2_TEXT" = "Торкніть тут і виберіть відповідь"; +"TIMED_WALK_QUESTION_2_TEXT" = "Торкніть тут і виберіть відповідь."; "TIMED_WALK_QUESTION_2_CHOICE" = "Немає"; "TIMED_WALK_QUESTION_2_CHOICE_2" = "Однобічна тростина"; "TIMED_WALK_QUESTION_2_CHOICE_3" = "Однобічна милиця"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Візьміть кілок двома пальцями."; "HOLE_PEG_TEST_TEXT_2" = "Підніміть пальці, щоб опустити кілок."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Тест на тремтіння"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Цей тест вимірює рівень тремтіння рук у різних положеннях. Знайдіть місце, де можна зручно сидіти протягом виконання цього тесту."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Тримайте телефон у найбільш ураженій руці, як це показано на зображенні нижче."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Тримайте телефон у ПРАВІЙ руці, як це показано на зображенні нижче."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Тримайте телефон у ЛІВІЙ руці, як це показано на зображенні нижче."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Вам буде запропоновано виконати %@, сидячи з телефоном у руці."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "завдання"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "два завдання"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "три завдання"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "чотири завдання"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "пʼять завдань"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Торкніть «Далі», щоб продовжити."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Готуйтеся тримати телефон на колінах."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Готуйтеся тримати телефон на колінах ЛІВОЮ рукою."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Готуйтеся тримати телефон на колінах ПРАВОЮ рукою."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Продовжуйте тримати телефон на колінах протягом %ld секунд."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Тепер тримайте телефон рукою, протягнутою на рівні плечей."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Тепер тримайте телефон у ЛІВІЙ руці із зігнутим ліктем, протягнутою на рівні плечей."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Тепер тримайте телефон у ПРАВІЙ руці із зігнутим ліктем, протягнутою на рівні плечей."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Продовжуйте тримати телефон простягнутою рукою протягом %ld секунд."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Тепер тримайте телефон на висоті плечей у руці із зігнутим ліктем."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Тепер тримайте телефон у ЛІВІЙ руці із зігнутим ліктем на рівні плечей."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Тепер тримайте телефон у ПРАВІЙ руці із зігнутим ліктем на рівні плечей."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Продовжуйте тримати телефон у руці із зігнутим ліктем протягом %ld секунд"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Тепер, не розгинаючи ліктя, торкайтеся неодноразово телефоном свого носа."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Тепер, тримаючи телефон у ЛІВІЙ руці із зігнутим ліктем, торкайтеся неодноразово телефоном свого носа."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Тепер, тримаючи телефон у ПРАВІЙ руці із зігнутим ліктем, торкайтеся неодноразово телефоном свого носа."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Продовжуйте торкатися телефоном свого носа протягом %ld секунд"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Готуйтеся махати, як це робить королева (вертячи запʼястком)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Готуйтеся махати телефоном у ЛІВІЙ руці, як це робить королева (вертячи запʼястком)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Готуйтеся махати телефоном у ПРАВІЙ руці, як це робить королева (вертячи запʼястком)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Продовжуйте виконувати махання королеви протягом %ld секунд."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Тепер перекладіть телефон у ЛІВУ руку, і перейдіть до наступного завдання."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Тепер перекладіть телефон у ПРАВУ руку, і перейдіть до наступного завдання."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Перейдіть до наступного завдання."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Тест виконано."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Вам буде запропоновано виконати %@, сидячи з телефоном спочатку в одній руці, потім ще раз в іншій руці."; +"TREMOR_SKIP_LEFT_HAND" = "Я не можу виконати цю дію ЛІВОЮ рукою."; +"TREMOR_SKIP_RIGHT_HAND" = "Я не можу виконати цю дію ПРАВОЮ рукою."; +"TREMOR_SKIP_NEITHER" = "Я можу виконати цю дію обома руками."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Не вдалося створити файл"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Не вдалося вилучити достатньо файлів журналів, щоб досягти порогу"; @@ -371,13 +448,16 @@ "AX.MEMORY.TILE.ACTIVE" = "активна"; "AX.MEMORY.TILE.CORRECT" = "правильно"; -"AX.MEMORY.TILE.INCORRECT" = "неправильноб"; +"AX.MEMORY.TILE.INCORRECT" = "неправильно"; "AX.MEMORY.TILE.QUIESCENT" = "неактивний"; "AX.MEMORY.TILE.LABEL" = "Клітинка тесту на пам’ять"; "AX_IMAGE_CAPTURE_LABEL" = "Перегляд знімку"; "AX_IMAGE_CAPTURED_LABEL" = "Зроблений знімок"; +"AX_VIDEO_CAPTURE_LABEL" = "Перегляд знятого відео"; +"AX_VIDEO_CAPTURED_LABEL" = "Зняте відео"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Неможливо розмістити диск розміру %@ на диск розміру %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Ціль"; "AX_TOWER_OF_HANOI_TOWER" = "Вежа"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Має диски з розмірами %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Пусто"; -"AX_GRAPH_RANGE_FORMAT" = "Діапазон від %@ до %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Діапазон від %@ до %@"; +"AX_GRAPH_STACK_PREFIX" = "Стос, створений із"; "AX_GRAPH_AND_SEPARATOR" = " і "; "AX_GRAPH_POINT_%@" = "Точка: %@"; diff --git a/ResearchKit/Localized/uk.lproj/locversion.plist b/ResearchKit/Localized/uk.lproj/locversion.plist index 331be32d..f1ef1b72 100644 --- a/ResearchKit/Localized/uk.lproj/locversion.plist +++ b/ResearchKit/Localized/uk.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale uk LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/vi.lproj/ResearchKit.strings b/ResearchKit/Localized/vi.lproj/ResearchKit.strings index 021616b7..066da6ac 100644 --- a/ResearchKit/Localized/vi.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/vi.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "Chỉ cho phép các ký tự số."; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "Chỉ báo tiến trình nhập mã khóa"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "Đã nhập %@ / %@ số"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "Bạn quên mật mã?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "Không thể thêm mục Chuỗi khóa."; @@ -167,6 +168,11 @@ "BOOL_NO" = "Không"; "BOOL_YES" = "Có"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "cm"; +"MEASURING_UNIT_FT" = "ft"; +"MEASURING_UNIT_IN" = "in"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "Chạm để trả lời"; "NULL_ANSWER" = "Chọn một câu trả lời"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "Lưu để Sau này"; "BUTTON_OPTION_DISCARD" = "Hủy bỏ Kết quả"; "BUTTON_OPTION_STOP_TASK" = "Kết thúc Nhiệm vụ"; +"BUTTON_SAVE" = "Lưu"; +"BUTTON_CLEAR_ANSWER" = "Xóa câu trả lời"; +"BUTTON_READ_ONLY_MODE" = "Không thể sửa đổi câu trả lời này."; /* General active tasks. */ "COUNTDOWN_LABEL" = "Bắt đầu hoạt động sau"; "TASK_COMPLETE_TITLE" = "Hoạt động Hoàn thành"; "TASK_COMPLETE_TEXT" = "Dữ liệu của bạn sẽ được phân tích và bạn sẽ được thông báo khi có kết quả."; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "Còn lại %@ giây."; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "Chụp Ảnh"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "Không có thư mục đầu ra nào được chỉ định cho hình ảnh được chụp."; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "Không thể lưu hình ảnh đã chụp."; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "Bắt đầu Ghi"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "Dừng Ghi"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "Quay lại Video"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "Thể dục"; "FITNESS_DISTANCE_TITLE_FORMAT" = "Quãng đường (%@)"; @@ -216,22 +231,39 @@ "WALK_TASK_TITLE" = "Dáng đi và Thăng bằng"; "WALK_INTRO_TEXT" = "Hoạt động này sẽ đo khả năng thăng bằng và dáng đi của bạn khi bạn đi bộ và đứng yên. Không tiếp tục hoạt động nếu bạn không thể đi bộ an toàn mà không có sự hỗ trợ."; "WALK_INTRO_2_TEXT_%ld" = "Tìm một nơi mà bạn có thể đi bộ an toàn, không cần có sự hỗ trợ, trong khoảng %ld bước theo đường thẳng."; -"WALK_INTRO_2_DETAIL" = "Cho điện thoại vào túi hoặc vào bao và làm theo lời hướng dẫn."; +"WALK_INTRO_2_DETAIL" = "Cho điện thoại vào túi hoặc vào giỏ và làm theo lời hướng dẫn."; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "Bây giờ, đứng yên trong %@."; "WALK_STAND_INSTRUCTION_FORMAT" = "Đứng yên trong %@."; "WALK_RETURN_INSTRUCTION_FORMAT" = "Quay đầu lại và đi bộ về nơi bạn bắt đầu."; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "Đi bộ tối đa %ld bước theo đường thẳng."; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "Tìm một nơi mà bạn có thể đi bộ an toàn về phía sau và phía trước theo đường thẳng. Cố gắng đi bộ liên tục bằng cách rẽ cuối đường, như thể bạn đang đi bộ dọc quanh hình nón.\n\nTiếp theo, bạn sẽ được hướng dẫn đi vòng hình tròn, sau đó đứng yên với hai cánh tay ở bên sườn và hai chân dang rộng tầm chiều rộng của vai."; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "Chạm Bắt đầu khi bạn đã sẵn sàng bắt đầu.\nSau đó, cho điện thoại vào túi hoặc vào giỏ và làm theo hướng dẫn."; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "Đi bộ về phía sau và phía trước theo đường thẳng trong %@. Đi bộ bình thường."; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "Xoay một vòng tròn rồi đứng yên trong %@."; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "Bạn đã hoàn thành hoạt động."; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "Tốc độ Chạm"; +"TAPPING_TASK_TITLE_RIGHT" = "Tay Phải"; +"TAPPING_TASK_TITLE_LEFT" = "Tay Trái"; "TAPPING_INTRO_TEXT" = "Hoạt động này sẽ đo tốc độ chạm của bạn."; -"TAPPING_INTRO_TEXT_2_FORMAT" = "Đặt điện thoại trên bề mặt phẳng. Hai nút sẽ xuất hiện trên màn hình trong %@. Dùng hai ngón tay trên một bàn tay thay phiên nhau chạm vào các nút đó nhanh hết mức có thể."; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "Đặt điện thoại trên một bề mặt phẳng."; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "Sử dụng hai ngón tay trên cùng bàn tay bạn để luân phiên chạm vào các nút trên màn hình."; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "Sử dụng hai ngón tay trên bàn tay phải bạn để luân phiên chạm vào các nút trên màn hình."; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "Sử dụng hai ngón tay trên bàn tay trái bạn để luân phiên chạm vào các nút trên màn hình."; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "Bây giờ, hãy lặp lại bài kiểm tra tương tự bằng tay phải của bạn."; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "Bây giờ, hãy lặp lại bài kiểm tra tương tự bằng tay trái của bạn."; +"TAPPING_INTRO_TEXT_2_FORMAT" = "Chạm một ngón tay, sau đó chạm ngón còn lại. Cố gắng tính thời gian số lần chạm chẵn nhất có thể. Tiếp tục chạm trong %@."; "TAPPING_CALL_TO_ACTION" = "Chạm vào Bắt đầu để bắt đầu."; +"TAPPING_CALL_TO_ACTION_NEXT" = "Chạm Tiếp để bắt đầu."; "TAP_BUTTON_TITLE" = "Chạm"; "TOTAL_TAPS_LABEL" = "Tổng Lần chạm"; -"TAPPING_INSTRUCTION" = "Chạm vào các nút bằng hai ngón tay với tốc độ nhanh hết mức có thể."; - +"TAPPING_INSTRUCTION" = "Chạm vào các nút bằng hai ngón tay liên tục nhất có thể."; +"TAPPING_INSTRUCTION_RIGHT" = "Chạm nút bằng tay PHẢI của bạn."; +"TAPPING_INSTRUCTION_LEFT" = "Chạm nút bằng tay TRÁI của bạn."; +"TAPPING_SKIP_TITLE" = "Bỏ qua tay này"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "Giọng nói"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "Hoạt động này sẽ đánh giá giọng nói của bạn bằng cách ghi âm bằng micrô ở dưới đáy điện thoại."; "AUDIO_TOO_LOUD_LABEL" = "Quá To"; "AUDIO_GENERIC_ERROR_LABEL" = "Không thể ghi âm"; +"AUDIO_LEVEL_CHECK_LABEL" = "Vui lòng đợi trong khi chúng tôi kiểm tra độ ồn trong nền."; +"AUDIO_TOO_LOUD_MESSAGE" = "Độ ồn xung quanh quá lớn để ghi âm giọng nói của bạn. Vui lòng di chuyển đến nơi nào đó yên tĩnh hơn và thử lại."; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "Chạm Tiếp khi sẵn sàng."; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "Trắc thính Âm báo"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "Nhặt miếng gỗ bằng hai ngón tay."; "HOLE_PEG_TEST_TEXT_2" = "Nhấc các ngón tay để thả rơi miếng gỗ."; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "Hoạt động Rung"; +"TREMOR_TEST_INTRO_1_DETAIL" = "Hoạt động này sẽ đo độ rung của các tay bạn ở những vị trí khác nhau. Tìm một địa điểm nơi bạn có thể ngồi thoải mái trong suốt hoạt động này."; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "Cầm điện thoại bằng tay thuận hơn như được hiển thị trong hình bên dưới."; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "Cầm điện thoại bằng tay PHẢI như được hiển thị trong hình bên dưới."; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "Cầm điện thoại bằng tay TRÁI như được hiển thị trong hình bên dưới."; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "Bạn sẽ được yêu cầu thực hiện %@ trong khi ngồi với điện thoại trên tay của mình."; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "một nhiệm vụ"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "hai nhiệm vụ"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "ba nhiệm vụ"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "bốn nhiệm vụ"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "năm nhiệm vụ"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "Chạm tiếp để tiếp tục."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "Chuẩn bị giữ điện thoại trong vạt áo của bạn."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "Chuẩn bị giữ điện thoại trong vạt áo bằng tay TRÁI của bạn."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "Chuẩn bị giữ điện thoại trong vạt áo bằng tay PHẢI của bạn."; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "Tiếp tục giữ điện thoại trong vạt áo bạn trong %ld giây."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "Bây giờ, hãy cầm điện thoại với tay của bạn duỗi ngang vai."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "Bây giờ, hãy cầm điện thoại với tay TRÁI của bạn duỗi ngang vai."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "Bây giờ, hãy cầm điện thoại với tay PHẢI của bạn duỗi ngang vai."; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "Tiếp tục cầm điện thoại với tay của bạn duỗi thẳng trong %ld giây."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "Bây giờ, hãy cầm điện thoại cao bằng vai cùng khủy tay bị gập."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "Bây giờ, hãy cầm điện thoại với tay TRÁI của bạn cao bằng vai cùng khủy tay bị gập."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "Bây giờ, hãy cầm điện thoại với tay PHẢI của bạn cao bằng vai cùng khủy tay bị gập."; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "Tiếp tục cầm điện thoại với khuỷu tay của bạn bị gập trong %ld giây"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "Bây giờ, hãy gập khuỷu tay bạn, chạm điện thoại vào mũi nhiều lần."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "Bây giờ, hãy giữ khuỷu tay bạn gập với điện thoại ở tay TRÁI, chạm điện thoại vào mũi nhiều lần."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "Bây giờ, hãy gập khuỷu tay bạn với điện thoại ở tay PHẢI, chạm điện thoại vào mũi nhiều lần."; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "Tiếp tục chạm điện thoại vào mũi bạn trong %ld giây"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "Chuẩn bị vẫy tay (vẫy bằng cách xoay cổ tay của bạn)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "Chuẩn bị vẫy tay với điện thoại ở tay TRÁI (vẫy bằng cách xoay cổ tay của bạn)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "Chuẩn bị vẫy tay với điện thoại ở tay PHẢI (vẫy bằng cách xoay cổ tay của bạn)."; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "Tiếp tục thực hiện vẫy tay trong %ld giây."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "Bây giờ, hãy chuyển điện thoại sang tay TRÁI và tiếp tục nhiệm vụ tiếp theo."; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "Bây giờ, hãy chuyển điện thoại sang tay PHẢI và tiếp tục nhiệm vụ tiếp theo."; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "Tiếp tục đến nhiệm vụ tiếp theo."; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "Hoạt động đã hoàn thành."; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "Bạn sẽ được yêu cầu thực hiện %@ trong khi ngồi với điện thoại trên một tay trước tiên, sau đó đặt lại lên tay còn lại."; +"TREMOR_SKIP_LEFT_HAND" = "Tôi không thể thực hiện hoạt động này bằng tay TRÁI."; +"TREMOR_SKIP_RIGHT_HAND" = "Tôi không thể thực hiện hoạt động này bằng tay PHẢI."; +"TREMOR_SKIP_NEITHER" = "Tôi có thể thực hiện hoạt động này bằng hai tay."; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "Không thể tạo tệp"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "Không thể xóa đủ số tệp bản ghi để đạt tới ngưỡng"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "Chụp bản xem trước"; "AX_IMAGE_CAPTURED_LABEL" = "Ảnh được chụp"; +"AX_VIDEO_CAPTURE_LABEL" = "Xem trước quay video"; +"AX_VIDEO_CAPTURED_LABEL" = "Video được quay"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "Không thể đặt đĩa có kích cỡ %@ lên trên đĩa có kích cỡ %@"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "Đích"; "AX_TOWER_OF_HANOI_TOWER" = "Tháp"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "Có đĩa có kích cỡ %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "Trống"; -"AX_GRAPH_RANGE_FORMAT" = "Trong khoảng từ %@ đến %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "Trong khoảng từ %@ đến %@"; +"AX_GRAPH_STACK_PREFIX" = "Ngăn xếp bao gồm"; "AX_GRAPH_AND_SEPARATOR" = " và "; "AX_GRAPH_POINT_%@" = "Điểm: %@"; diff --git a/ResearchKit/Localized/vi.lproj/locversion.plist b/ResearchKit/Localized/vi.lproj/locversion.plist index efe5dd22..0adccc64 100644 --- a/ResearchKit/Localized/vi.lproj/locversion.plist +++ b/ResearchKit/Localized/vi.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale vi LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/zh_CN.lproj/ResearchKit.strings b/ResearchKit/Localized/zh_CN.lproj/ResearchKit.strings index a240360f..1b5382a9 100644 --- a/ResearchKit/Localized/zh_CN.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/zh_CN.lproj/ResearchKit.strings @@ -34,7 +34,7 @@ "CONSENT_NAME_FAMILY" = "姓"; "CONSENT_NAME_PLACEHOLDER" = "必填"; "CONSENT_REVIEW_TITLE" = "检查"; -"CONSENT_REVIEW_INSTRUCTION" = "请检查下方的表单,确认后请轻按“同意”。"; +"CONSENT_REVIEW_INSTRUCTION" = "请检查下方的表单,确认后请轻点“同意”。"; "CONSENT_REVIEW_ALERT_TITLE" = "检查"; "CONSENT_SIGNATURE_TITLE" = "签名"; "CONSENT_SIGNATURE_INSTRUCTION" = "请用手指在下方的横线上签名。"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "仅允许数字字符。"; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "口令输入进度指示器"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "已输入 %@/%@ 位"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "忘记了密码?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "无法添加钥匙串项。"; @@ -167,11 +168,16 @@ "BOOL_NO" = "否"; "BOOL_YES" = "是"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "厘米"; +"MEASURING_UNIT_FT" = "英尺"; +"MEASURING_UNIT_IN" = "英寸"; + /* Default placeholders to request answers in a questionnaire. */ -"PLACEHOLDER_TEXT_OR_NUMBER" = "轻按来回答"; +"PLACEHOLDER_TEXT_OR_NUMBER" = "轻点来回答"; "NULL_ANSWER" = "选择一个答案"; -"PLACEHOLDER_IMAGE_CHOICES" = "轻按来选择"; -"PLACEHOLDER_LONG_TEXT" = "轻按来书写"; +"PLACEHOLDER_IMAGE_CHOICES" = "轻点来选择"; +"PLACEHOLDER_LONG_TEXT" = "轻点来书写"; /* Button titles */ "BUTTON_AGREE" = "同意"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "存储以稍后查看"; "BUTTON_OPTION_DISCARD" = "放弃结果"; "BUTTON_OPTION_STOP_TASK" = "结束任务"; +"BUTTON_SAVE" = "存储"; +"BUTTON_CLEAR_ANSWER" = "清除答案"; +"BUTTON_READ_ONLY_MODE" = "此答案无法修改。"; /* General active tasks. */ "COUNTDOWN_LABEL" = "即将开始活动"; "TASK_COMPLETE_TITLE" = "活动完成"; "TASK_COMPLETE_TEXT" = "将对您的数据进行分析并在结果可用时通知您。"; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "还剩 %@ 秒钟。"; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "捕捉图像"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "未指定捕捉图像的输出目录。"; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "无法存储捕捉的图像。"; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "开始录制"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "停止录制"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "重新采集视频"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "健身"; "FITNESS_DISTANCE_TITLE_FORMAT" = "距离(%@)"; @@ -210,7 +225,7 @@ "FITNESS_SIT_INSTRUCTION_FORMAT" = "请静坐 %@。"; "FITNESS_WALK_INSTRUCTION_FORMAT" = "以最快速度步行 %@。"; "FITNESS_INTRO_TEXT_FORMAT" = "本活动监控您的心率并测量 %1$@内的步行距离。"; -"FITNESS_INTRO_2_TEXT_FORMAT" = "请在室外以最快的速度步行 %1$@。步行完成后,请静坐 %2$@。若要开始,请轻按“开始”。"; +"FITNESS_INTRO_2_TEXT_FORMAT" = "请在室外以最快的速度步行 %1$@。步行完成后,请静坐 %2$@。若要开始,请轻点“开始”。"; /* Short walk active task. */ "WALK_TASK_TITLE" = "步态和平衡"; @@ -222,33 +237,53 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "转身并走回起点。"; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "请直线步行最多 %ld 步。"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "找到一处您可以沿直线安全往返的地方。在路线的尽头转弯,不要停下来,就好像绕着交通锥转圈一样。\n\n接下来会要求您转一圈,然后站立不动,双手放在两侧,双脚张开,与肩同宽。"; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "准备就绪后,轻点“开始”。\n将手机放入口袋或背包中,然后跟随音频指示操作。"; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "沿直线往返 %@。尽可能跟平时一样走动。"; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "走完一圈后站立不动,坚持 %@。"; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "您已经完成了本活动。"; /* Tapping active task. */ -"TAPPING_TASK_TITLE" = "轻按速度"; -"TAPPING_INTRO_TEXT" = "本活动测量您的轻按速度。"; -"TAPPING_INTRO_TEXT_2_FORMAT" = "请将您的手机置于平面。两个按钮将在屏幕上显示 %@。使用同一只手的两个手指,以最快速度交替轻按这两个按钮。"; -"TAPPING_CALL_TO_ACTION" = "轻按“开始”来进行测试。"; -"TAP_BUTTON_TITLE" = "轻按"; -"TOTAL_TAPS_LABEL" = "轻按总次数"; -"TAPPING_INSTRUCTION" = "使用两个手指以最快速度轻按按钮。"; - +"TAPPING_TASK_TITLE" = "轻点速度"; +"TAPPING_TASK_TITLE_RIGHT" = "右手"; +"TAPPING_TASK_TITLE_LEFT" = "左手"; +"TAPPING_INTRO_TEXT" = "本活动测量您的轻点速度。"; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "把手机放在平面上。"; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "用同一只手上的两个手指来轮流轻点屏幕上的按钮。"; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "用右手上的两个手指来轮流轻点屏幕上的按钮。"; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "用左手上的两个手指来轮流轻点屏幕上的按钮。"; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "现在用右手重复相同的测试。"; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "现在用左手重复相同的测试。"; +"TAPPING_INTRO_TEXT_2_FORMAT" = "用一个手指轻点,然后用另一个手指轻点。尽量保持均匀的轻点间隔。持续轻点 %@。"; +"TAPPING_CALL_TO_ACTION" = "轻点“开始”来进行测试。"; +"TAPPING_CALL_TO_ACTION_NEXT" = "轻点“下一步”来开始。"; +"TAP_BUTTON_TITLE" = "轻点"; +"TOTAL_TAPS_LABEL" = "轻点总次数"; +"TAPPING_INSTRUCTION" = "用两个手指尽可能以均匀的速度轻点按钮。"; +"TAPPING_INSTRUCTION_RIGHT" = "使用右手轻点按钮。"; +"TAPPING_INSTRUCTION_LEFT" = "使用左手轻点按钮。"; +"TAPPING_SKIP_TITLE" = "跳过这只手"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "嗓音"; -"AUDIO_CALL_TO_ACTION" = "轻按“开始”来进行测试。"; +"AUDIO_CALL_TO_ACTION" = "轻点“开始”来进行测试。"; "AUDIO_INSTRUCTION" = "请对着麦克风说“啊啊啊”,时间越长越好。"; "AUDIO_INTRO_TEXT" = "请深呼吸并对着麦克风说“啊啊啊”,时间越长越好。保持平稳的声音大小以使音频条保持蓝色。"; "AUDIO_INTENDED_USE" = "本活动通过将您的嗓音录制到手机底部的麦克风来对其进行评估。"; "AUDIO_TOO_LOUD_LABEL" = "太大声"; "AUDIO_GENERIC_ERROR_LABEL" = "无法录音"; +"AUDIO_LEVEL_CHECK_LABEL" = "请耐心等待,我们正在检查背景噪声级。"; +"AUDIO_TOO_LOUD_MESSAGE" = "环境噪声级太高,无法录制您的声音。请移至较为安静的地方,然后再试一次。"; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "就绪后,轻点“下一步”。"; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "纯音测听"; "TONE_AUDIOMETRY_INTENDED_USE" = "本活动测量您是否可听见不同的声音。"; "TONE_AUDIOMETRY_INTRO_TEXT" = "请在开始前插入并戴上耳机。"; -"TONE_AUDIOMETRY_CALL_TO_ACTION" = "轻按“开始”来进行测试。"; -"TONE_AUDIOMETRY_PREP_TEXT" = "现在您应该听到一个音调。使用设备一侧的控制来调整音量。\n\n请在准备好后轻按该按钮来开始测试。"; -"TONE_AUDIOMETRY_INSTRUCTION" = "请在每次开始听到声音时轻按该按钮。"; +"TONE_AUDIOMETRY_CALL_TO_ACTION" = "轻点“开始”来进行测试。"; +"TONE_AUDIOMETRY_PREP_TEXT" = "现在您应该听到一个音调。使用设备一侧的控制来调整音量。\n\n请在准备好后轻点该按钮来开始测试。"; +"TONE_AUDIOMETRY_INSTRUCTION" = "请在每次开始听到声音时轻点该按钮。"; "TONE_LABEL_%@_LEFT" = "%@ Hz,左"; "TONE_LABEL_%@_RIGHT" = "%@ Hz,右"; @@ -257,29 +292,29 @@ "SPATIAL_SPAN_MEMORY_INTRO_TEXT_%@" = "本活动通过重现%@亮起的顺序来测量您的短期空间记忆能力。"; "SPATIAL_SPAN_MEMORY_TARGET_PLURAL" = "花朵"; "SPATIAL_SPAN_MEMORY_TARGET_STANDALONE" = "花朵"; -"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "部分%@一次只亮起一个。请以亮起的顺序轻按这些%@。"; -"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_REVERSE_%@" = "部分%@一次只亮起一个。请以与亮起相反的顺序轻按这些%@。"; -"SPATIAL_SPAN_MEMORY_CALL_TO_ACTION" = "若要开始,请轻按“开始”,然后留心观察。"; +"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_%@" = "部分%@一次只亮起一个。请以亮起的顺序轻点这些%@。"; +"SPATIAL_SPAN_MEMORY_INTRO_2_TEXT_REVERSE_%@" = "部分%@一次只亮起一个。请以与亮起相反的顺序轻点这些%@。"; +"SPATIAL_SPAN_MEMORY_CALL_TO_ACTION" = "若要开始,请轻点“开始”,然后留心观察。"; "MEMORY_GAME_ITEM_COUNT_TITLE_%@" = "%@"; "MEMORY_GAME_SCORE_TITLE" = "得分"; "MEMORY_GAME_PLAYBACK_TITLE_%@" = "观察亮起的%@"; -"MEMORY_GAME_GAMEPLAY_TITLE_%@" = "请以%@亮起的顺序轻按它们"; -"MEMORY_GAME_GAMEPLAY_REVERSE_TITLE_%@" = "请以相反的顺序轻按%@"; +"MEMORY_GAME_GAMEPLAY_TITLE_%@" = "请以%@亮起的顺序轻点它们"; +"MEMORY_GAME_GAMEPLAY_REVERSE_TITLE_%@" = "请以相反的顺序轻点%@"; "MEMORY_GAME_COMPLETE_TITLE" = "顺序完成"; -"MEMORY_GAME_COMPLETE_MESSAGE" = "轻按“下一步”来继续"; +"MEMORY_GAME_COMPLETE_MESSAGE" = "轻点“下一步”来继续"; "MEMORY_GAME_FAILED_TITLE" = "再试一次"; -"MEMORY_GAME_FAILED_MESSAGE" = "您好像记错了顺序。轻按“下一步”来继续。"; +"MEMORY_GAME_FAILED_MESSAGE" = "您好像记错了顺序。轻点“下一步”来继续。"; "MEMORY_GAME_TIMEOUT_TITLE" = "时间已到"; -"MEMORY_GAME_TIMEOUT_MESSAGE" = "时间已到。\n轻按“下一步”来继续。"; +"MEMORY_GAME_TIMEOUT_MESSAGE" = "时间已到。\n轻点“下一步”来继续。"; "MEMORY_GAME_COMPLETE" = "游戏完成"; "MEMORY_GAME_PAUSED_TITLE" = "暂停"; -"MEMORY_GAME_PAUSED_MESSAGE" = "轻按“下一步”来继续"; +"MEMORY_GAME_PAUSED_MESSAGE" = "轻点“下一步”来继续"; /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "反应时间"; "REACTION_TIME_TASK_INTENDED_USE" = "本活动评估您对视觉提示的反应时间。"; "REACTION_TIME_TASK_INTRO_TEXT_FORMAT" = "屏幕出现蓝色圆点时立刻朝任意方向摇动设备。您将需要完成此操作 %D 次。"; -"REACTION_TIME_TASK_CALL_TO_ACTION" = "轻按“开始”来进行测试。"; +"REACTION_TIME_TASK_CALL_TO_ACTION" = "轻点“开始”来进行测试。"; "REACTION_TIME_TASK_ATTEMPTS_FORMAT" = "第 %@/%@ 次尝试"; "REACTION_TIME_TASK_ACTIVE_STEP_TITLE" = "蓝色圆圈出现时快速摇动设备"; @@ -320,7 +355,7 @@ "PVSAT_INTRO_TEXT" = "“步进式视觉累加实验”测量您的视觉信息处理速度和计算能力。"; "PAVSAT_INTRO_TEXT" = "“步进式听觉和视觉累加实验”测量您的听觉和视觉信息处理速度和计算能力。"; "PSAT_INTRO_TEXT_2_%@" = "每隔 %@ 秒钟会显示一个一位数。\n您必须将每个新数字与前面相邻的数字相加。\n注意,您不准计算累加值,只能计算最后两个数字之和。"; -"PSAT_CALL_TO_ACTION" = "轻按“开始”来进行测试。"; +"PSAT_CALL_TO_ACTION" = "轻点“开始”来进行测试。"; "PSAT_INITIAL_INSTRUCTION" = "记住这第一个数字。"; "PSAT_INSTRUCTION" = "将这个新数字与前一个数字相加。"; "PSAT_NO_DIGIT" = "-"; @@ -331,7 +366,7 @@ "HOLE_PEG_TEST_INTRO_TEXT_2_LEFT_HAND_FIRST_%@" = "您的左手和右手都需要进行测试。\n您必须以最快速度拿起圆饼,将其放入圆孔中,完成 %@ 次后,再将其移除 %@ 次。"; "HOLE_PEG_TEST_INTRO_TEXT_2_RIGHT_HAND_FIRST_%@" = "您的右手和左手都需要进行测试。\n您必须以最快速度拿起圆饼,将其放入圆孔中,完成 %@ 次后,再将其移除 %@ 次。"; -"HOLE_PEG_TEST_CALL_TO_ACTION" = "轻按“开始”来进行测试。"; +"HOLE_PEG_TEST_CALL_TO_ACTION" = "轻点“开始”来进行测试。"; "HOLE_PEG_TEST_PLACE_INSTRUCTION_LEFT_HAND" = "用您的左手将圆饼放入圆孔中。"; "HOLE_PEG_TEST_PLACE_INSTRUCTION_RIGHT_HAND" = "用您的右手将圆饼放入圆孔中。"; "HOLE_PEG_TEST_REMOVE_INSTRUCTION_LEFT_HAND" = "用您的左手将圆饼放在线条后方。"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "用两个手指拿起圆饼。"; "HOLE_PEG_TEST_TEXT_2" = "抬起手指以放下圆饼。"; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "颤抖活动"; +"TREMOR_TEST_INTRO_1_DETAIL" = "本活动测试在不同姿势下,您双手的颤抖情况。请找到一处舒适的地方坐下并完成此活动。"; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "如下图所示,用更易受到影响的手握住手机。"; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "如下图所示,用右手握住手机。"; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "如下图所示,用左手握住手机。"; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "请坐下并用手握住手机,然后完成%@。"; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "一个任务"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "两个任务"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "三个任务"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "四个任务"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "五个任务"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "轻点下一步来继续。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "准备握住手机并放在膝盖上。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "准备用左手握住手机并放在膝盖上。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "准备用右手握住手机并放在膝盖上。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "握住手机并放在膝盖上,坚持 %ld 秒钟。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "现在伸直手臂并将手机举至肩高。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "现在伸直左手臂并将手机举至肩高。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "现在伸直右手臂并将手机举至肩高。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "握住手机并伸直手臂,坚持 %ld 秒钟。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "现在把手机举至肩高并弯曲手肘。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "现在用左手握住手机,举至肩高并弯曲手肘。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "现在用右手握住手机,举至肩高并弯曲手肘。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "握住手机并弯曲手肘,坚持 %ld 秒钟"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "现在弯曲手肘,重复用手机接触您的鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "现在弯曲手肘并用左手握住手机,重复用手机接触您的鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "现在弯曲手肘并用右手握住手机,重复用手机接触您的鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "用手机接触鼻子,坚持 %ld 秒钟"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "准备挥手(通过转动手腕来挥手)。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "用左手握住手机并准备挥手(通过转动手腕来挥手)。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "用右手握住手机并准备挥手(通过转动手腕来挥手)。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "持续挥手,坚持 %ld 秒钟。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "现在换左手握住手机并继续下一个任务。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "现在换右手握住手机并继续下一个任务。"; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "继续下一个任务。"; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "活动完成。"; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "请坐下并用一只手握住手机,然后完成%@,接着换另一只手再完成一次。"; +"TREMOR_SKIP_LEFT_HAND" = "我不能用左手完成本活动。"; +"TREMOR_SKIP_RIGHT_HAND" = "我不能用右手完成本活动。"; +"TREMOR_SKIP_NEITHER" = "我能用两只手完成本活动。"; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "无法创建文件"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "无法移除足够的日志文件来达到阈值"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "捕捉预览"; "AX_IMAGE_CAPTURED_LABEL" = "捕捉的图像"; +"AX_VIDEO_CAPTURE_LABEL" = "视频采集预览"; +"AX_VIDEO_CAPTURED_LABEL" = "采集的视频"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "无法将大小为“%@”的圆盘放在大小为“%@”的圆盘上"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "目标圆盘"; "AX_TOWER_OF_HANOI_TOWER" = "塔"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "包含圆盘,大小为“%@”"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "空"; -"AX_GRAPH_RANGE_FORMAT" = "范围:%@ ~ %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "范围:%@ ~ %@"; +"AX_GRAPH_STACK_PREFIX" = "圆盘堆组成:"; "AX_GRAPH_AND_SEPARATOR" = "、"; "AX_GRAPH_POINT_%@" = "分数:%@"; diff --git a/ResearchKit/Localized/zh_CN.lproj/locversion.plist b/ResearchKit/Localized/zh_CN.lproj/locversion.plist index 53ecb546..e6481e9b 100644 --- a/ResearchKit/Localized/zh_CN.lproj/locversion.plist +++ b/ResearchKit/Localized/zh_CN.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale zh_CN LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/zh_HK.lproj/ResearchKit.strings b/ResearchKit/Localized/zh_HK.lproj/ResearchKit.strings index 6fe69202..3fd51c83 100644 --- a/ResearchKit/Localized/zh_HK.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/zh_HK.lproj/ResearchKit.strings @@ -34,7 +34,7 @@ "CONSENT_NAME_FAMILY" = "姓氏"; "CONSENT_NAME_PLACEHOLDER" = "必填"; "CONSENT_REVIEW_TITLE" = "同意書檢閱"; -"CONSENT_REVIEW_INSTRUCTION" = "請檢閱以下的文件。若你準備好繼續,請點一下「同意」。"; +"CONSENT_REVIEW_INSTRUCTION" = "請檢閲以下的文件。如果你準備好繼續,請點一下「同意」。"; "CONSENT_REVIEW_ALERT_TITLE" = "同意書檢閱"; "CONSENT_SIGNATURE_TITLE" = "簽名"; "CONSENT_SIGNATURE_INSTRUCTION" = "請用手指在下方的橫線上簽名。"; @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "只允許輸入數字。"; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "密碼輸入進度指示器"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "已輸入 %@ 個數字(共 %@ 個)"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "忘記密碼?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "無法加入「鑰匙圈」項目。"; @@ -167,6 +168,11 @@ "BOOL_NO" = "不是"; "BOOL_YES" = "是"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "厘米"; +"MEASURING_UNIT_FT" = "呎"; +"MEASURING_UNIT_IN" = "吋"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "點一下回答"; "NULL_ANSWER" = "選擇答案"; @@ -189,20 +195,29 @@ "BUTTON_OPTION_SAVE" = "儲存作日後之用"; "BUTTON_OPTION_DISCARD" = "放棄測試結果"; "BUTTON_OPTION_STOP_TASK" = "結束測試任務"; +"BUTTON_SAVE" = "儲存"; +"BUTTON_CLEAR_ANSWER" = "清除答案"; +"BUTTON_READ_ONLY_MODE" = "無法修改此答案。"; /* General active tasks. */ "COUNTDOWN_LABEL" = "測試活動倒數"; "TASK_COMPLETE_TITLE" = "測試活動已完成"; "TASK_COMPLETE_TEXT" = "測試活動將會進行分析。當得到結果時,你將會收到通知。"; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "剩餘 %@ 秒。"; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "截取圖案"; "CAPTURE_BUTTON_RECAPTURE_IMAGE" = "重新截取圖案"; "CAPTURE_ERROR_CAMERA_NOT_FOUND" = "找不到相機,無法完成此步驟。"; -"CAPTURE_ERROR_NO_PERMISSIONS" = "若要完成此步驟,請前往「設定」以允許此 App 使用相機。"; +"CAPTURE_ERROR_NO_PERMISSIONS" = "如要完成此步驟,請前往「設定」以允許此 App 使用相機。"; "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "未指定截取圖案的輸出目錄。"; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "無法儲存截取的圖案。"; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "開始錄音"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "停止錄影"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "重新截取影片"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "體能"; "FITNESS_DISTANCE_TITLE_FORMAT" = "距離(%@)"; @@ -214,7 +229,7 @@ /* Short walk active task. */ "WALK_TASK_TITLE" = "步態及平衡"; -"WALK_INTRO_TEXT" = "此測試活動可測量你步行及站立時的步態及平衡。若你行動不便或行走時需要輔助,請勿繼續進行。"; +"WALK_INTRO_TEXT" = "此測試活動可測量你步行及站立時的步態及平衡。如果你行動不便或行走時需要輔助,請勿繼續進行。"; "WALK_INTRO_2_TEXT_%ld" = "找一個安全的地方,讓你可以不靠輔助地直線步行大約 %ld 步。"; "WALK_INTRO_2_DETAIL" = "將電話放進口袋、手袋或背包裏,並跟隨語音指示。"; "WALK_STAND_VOICE_INSTRUCTION_FORMAT" = "現在站立 %@。"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "掉頭,然後步行回到起點。"; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "直線步行最多 %ld 步。"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "找一個安全的地方,讓你可以直線來回步行。請嘗試不停步行,遇到盡頭時請有如繞過雪糕筒般掉頭。\n\n下一步,你將需要轉一整個圈,然後站着不動,雙手放在兩旁,而雙腳張開至肩膊的闊度。"; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "如果你準備好開始,請點一下「開始」。\n然後將電話放進口袋、手袋或背包裏,並跟隨語音指示。"; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "以平常姿態,直線來回步行 %@。"; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "轉一個圈,然後站立 %@。"; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "你已完成測試活動。"; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "點按速度"; +"TAPPING_TASK_TITLE_RIGHT" = "右手"; +"TAPPING_TASK_TITLE_LEFT" = "左手"; "TAPPING_INTRO_TEXT" = "此測試活動能評估你的點按速度。"; -"TAPPING_INTRO_TEXT_2_FORMAT" = "請先平放電話。螢幕上將顯示兩個按鈕,請用同一隻手的兩指,在 %@內以最快的速度梅花間竹地點按這些按鈕。"; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "請先平放電話。"; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "請用同一隻手的兩指梅花間竹地點按螢幕上的按鈕。"; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "請用右手的兩指梅花間竹地點按螢幕上的按鈕。"; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "請用左手的兩指梅花間竹地點按螢幕上的按鈕。"; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "現在用右手進行相同的測試。"; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "現在用左手進行相同的測試。"; +"TAPPING_INTRO_TEXT_2_FORMAT" = "先用一指點按,然後用另一指點按。請嘗試以最平穩的速度,持續點按 %@。"; "TAPPING_CALL_TO_ACTION" = "點一下「開始」以進行測試。"; +"TAPPING_CALL_TO_ACTION_NEXT" = "點一下「下一步」開始。"; "TAP_BUTTON_TITLE" = "點按"; "TOTAL_TAPS_LABEL" = "點按總次數"; -"TAPPING_INSTRUCTION" = "用兩指以最快的速度點按這些按鈕。"; - +"TAPPING_INSTRUCTION" = "用兩指以最平穩的速度點按這些按鈕。"; +"TAPPING_INSTRUCTION_RIGHT" = "用你的右手點按這些按鈕。"; +"TAPPING_INSTRUCTION_LEFT" = "用你的左手點按這些按鈕。"; +"TAPPING_SKIP_TITLE" = "略過這隻手"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "語音"; @@ -241,13 +273,16 @@ "AUDIO_INTENDED_USE" = "此測試活動會使用電話底部的咪高風錄音,以評估你的聲音。"; "AUDIO_TOO_LOUD_LABEL" = "太大聲"; "AUDIO_GENERIC_ERROR_LABEL" = "無法錄音"; +"AUDIO_LEVEL_CHECK_LABEL" = "正在檢查背景雜音音量,請稍候。"; +"AUDIO_TOO_LOUD_MESSAGE" = "環境雜音太大聲,無法錄取你的聲音。請前往較靜的地方,然後再試一次。"; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "準備好後,請點一下「下一步」。"; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "純音聽力檢查"; "TONE_AUDIOMETRY_INTENDED_USE" = "此測試活動能評估你聆聽不同聲音的能力。"; "TONE_AUDIOMETRY_INTRO_TEXT" = "在開始之前,請插入並戴上耳筒。"; "TONE_AUDIOMETRY_CALL_TO_ACTION" = "點一下「開始」以進行測試。"; -"TONE_AUDIOMETRY_PREP_TEXT" = "你現在應該聽到一個音頻。請使用裝置旁的音量按鈕以調整音量。\n\n若你準備好開始,請點一下按鈕。"; +"TONE_AUDIOMETRY_PREP_TEXT" = "你現在應該聽到一個音頻。請使用裝置旁的音量按鈕以調整音量。\n\n如果你準備好開始,請點一下按鈕。"; "TONE_AUDIOMETRY_INSTRUCTION" = "每次當你開始聽到聲音時,請點一下按鈕。"; "TONE_LABEL_%@_LEFT" = "%@ Hz,左"; "TONE_LABEL_%@_RIGHT" = "%@ Hz,右"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "用兩指拿起圓柱。"; "HOLE_PEG_TEST_TEXT_2" = "放開手指以放下圓柱。"; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "顫抖測試活動"; +"TREMOR_TEST_INTRO_1_DETAIL" = "此測試活動可測量你雙手不同位置的顫抖情況。請找一個地方,讓你可以在此測試活動期間舒適坐下。"; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "請用較受影響的手拿着電話,如下圖所示。"; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "請用右手拿着電話,如下圖所示。"; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "請用左手拿着電話,如下圖所示。"; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "你將需要坐着,並拿着電話進行%@。"; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "一個任務"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "兩個任務"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "三個任務"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "四個任務"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "五個任務"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "點一下「下一步」繼續。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "請準備將手放在大腿上,然後拿着電話。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "請準備將左手放在大腿上,然後拿着電話。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "請準備將右手放在大腿上,然後拿着電話。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "將手放在大腿上,然後拿着電話 %ld 秒。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "現在伸直手臂,並將電話拿到肩膊的高度。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "現在伸直左手手臂,並將電話拿到肩膊的高度。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "現在伸直右手手臂,並將電話拿到肩膊的高度。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "伸直手臂,然後拿着電話 %ld 秒。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "現在彎曲手肘,並將電話拿到肩膊的高度。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "現在彎曲左手手肘,並將電話拿到肩膊的高度。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "現在彎曲右手手肘,並將電話拿到肩膊的高度。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "彎曲手肘,然後拿着電話 %ld 秒"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "現在繼續彎曲手肘,並用電話重複觸碰鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "現在繼續彎曲左手手肘,並拿着電話重複觸碰鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "現在繼續彎曲右手手肘,並拿着電話重複觸碰鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "拿着電話觸碰鼻子 %ld 秒"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "請準備進行揮手動作(只揮動手腕)。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "請準備用左手拿着電話,進行揮手動作(只揮動手腕)。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "請準備用右手拿着電話,進行揮手動作(只揮動手腕)。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "繼續進行揮手動作 %ld 秒。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "現在用左手拿着電話,並繼續進行下一個任務。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "現在用右手拿着電話,並繼續進行下一個任務。"; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "繼續進行下一個任務。"; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "測試活動已完成。"; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "你將需要坐着,先用一隻手拿着電話進行%@,然後再用另一隻手進行。"; +"TREMOR_SKIP_LEFT_HAND" = "我無法用左手進行此測試活動。"; +"TREMOR_SKIP_RIGHT_HAND" = "我無法用右手進行此測試活動。"; +"TREMOR_SKIP_NEITHER" = "我可以用雙手進行此測試活動。"; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "無法製作檔案"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "無法移除足夠的記錄檔案以達到臨界值"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "截取預覽"; "AX_IMAGE_CAPTURED_LABEL" = "截取的圖案"; +"AX_VIDEO_CAPTURE_LABEL" = "截取影片預覽"; +"AX_VIDEO_CAPTURED_LABEL" = "截取的影片"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "無法將 %@ 號的圓盤放在 %@ 號的圓盤上"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "目標"; "AX_TOWER_OF_HANOI_TOWER" = "塔座"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "其中的圓盤大小是 %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "空白"; -"AX_GRAPH_RANGE_FORMAT" = "範圍介乎 %@ 至 %@"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "範圍介乎 %@ 至 %@"; +"AX_GRAPH_STACK_PREFIX" = "圓盤柱的組成方式:"; "AX_GRAPH_AND_SEPARATOR" = " 與 "; "AX_GRAPH_POINT_%@" = "點數:%@"; diff --git a/ResearchKit/Localized/zh_HK.lproj/locversion.plist b/ResearchKit/Localized/zh_HK.lproj/locversion.plist index 7980eea6..6166cb39 100644 --- a/ResearchKit/Localized/zh_HK.lproj/locversion.plist +++ b/ResearchKit/Localized/zh_HK.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale zh_HK LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/Localized/zh_TW.lproj/ResearchKit.strings b/ResearchKit/Localized/zh_TW.lproj/ResearchKit.strings index 3bd4b20a..493de9f5 100644 --- a/ResearchKit/Localized/zh_TW.lproj/ResearchKit.strings +++ b/ResearchKit/Localized/zh_TW.lproj/ResearchKit.strings @@ -141,6 +141,7 @@ "PASSCODE_TEXTFIELD_INVALID_INPUT_MESSAGE" = "僅允許數字字元。"; "PASSCODE_TEXTFIELD_ACCESSIBILITY_LABEL" = "密碼輸入進度指示器"; "PASSCODE_TEXTFIELD_ACCESSIBILTIY_VALUE" = "已輸入 %1$@ 個數字(共 %2$@ 個)"; +"PASSCODE_FORGOT_BUTTON_TITLE" = "忘記密碼?"; /* Keychain wrapper */ "KEYCHAIN_ADD_ERROR_MESSAGE" = "無法加入鑰匙圈項目。"; @@ -167,6 +168,11 @@ "BOOL_NO" = "否"; "BOOL_YES" = "是"; +/* Measuring unit abbreviations */ +"MEASURING_UNIT_CM" = "公分"; +"MEASURING_UNIT_FT" = "英尺"; +"MEASURING_UNIT_IN" = "英吋"; + /* Default placeholders to request answers in a questionnaire. */ "PLACEHOLDER_TEXT_OR_NUMBER" = "點一下來回答"; "NULL_ANSWER" = "選取答案"; @@ -189,11 +195,15 @@ "BUTTON_OPTION_SAVE" = "稍後再試"; "BUTTON_OPTION_DISCARD" = "捨棄結果"; "BUTTON_OPTION_STOP_TASK" = "結束任務"; +"BUTTON_SAVE" = "儲存"; +"BUTTON_CLEAR_ANSWER" = "清除答案"; +"BUTTON_READ_ONLY_MODE" = "這個答案無法修改。"; /* General active tasks. */ "COUNTDOWN_LABEL" = "準備開始活動:"; "TASK_COMPLETE_TITLE" = "活動完成"; "TASK_COMPLETE_TEXT" = "您的資料會經過分析,收到結果時會通知您。"; +"COUNTDOWN_SPOKEN_REMAINING_%@" = "剩餘 %@ 秒。"; /* Image capture step. */ "CAPTURE_BUTTON_CAPTURE_IMAGE" = "擷取影像"; @@ -203,6 +213,11 @@ "CAPTURE_ERROR_NO_OUTPUT_DIRECTORY" = "尚未指定擷取影像的輸出目錄。"; "CAPTURE_ERROR_CANNOT_WRITE_FILE" = "無法儲存擷取的影像。"; +/* Video capture step. */ +"CAPTURE_BUTTON_CAPTURE_VIDEO" = "開始錄音"; +"CAPTURE_BUTTON_STOP_CAPTURE_VIDEO" = "停止錄影"; +"CAPTURE_BUTTON_RECAPTURE_VIDEO" = "重新擷取影像"; + /* Fitness active task. */ "FITNESS_TASK_TITLE" = "健身"; "FITNESS_DISTANCE_TITLE_FORMAT" = "距離(%@)"; @@ -222,16 +237,33 @@ "WALK_RETURN_INSTRUCTION_FORMAT" = "請掉頭並走回您的起點。"; "WALK_OUTBOUND_INSTRUCTION_FORMAT" = "直線步行到最多 %ld 步。"; +/* Short walk back and forth. */ +"WALK_INTRO_2_TEXT_BACK_AND_FORTH_INSTRUCTION" = "找一個您可以安全地以直線來回步行的地點。請試著持續走到盡頭再折返,如同繞過交通錐折返。\n\n接著會指示您轉一圈,然後站著不動,雙手自然放鬆,並且雙腳張開與肩同寬。"; +"WALK_INTRO_2_DETAIL_BACK_AND_FORTH_INSTRUCTION" = "當您準備好時,請點一下「開始測試」。\n然後將電話放在口袋或包包裡面,並依照語音指示執行。"; +"WALK_BACK_AND_FORTH_INSTRUCTION_FORMAT" = "直線來回步行到 %@。請以您一般的步調行走。"; +"WALK_BACK_AND_FORTH_STAND_INSTRUCTION_FORMAT" = "旋轉一整圈,然後站著不動 %@。"; +"WALK_BACK_AND_FORTH_FINISHED_VOICE" = "您已完成活動。"; /* Tapping active task. */ "TAPPING_TASK_TITLE" = "點按速度"; +"TAPPING_TASK_TITLE_RIGHT" = "右手"; +"TAPPING_TASK_TITLE_LEFT" = "左手"; "TAPPING_INTRO_TEXT" = "此活動會測量您的點按速度。"; -"TAPPING_INTRO_TEXT_2_FORMAT" = "將電話放在平面上。螢幕上會出現兩個按鈕,顯示時間為 %@。用同一隻手的兩根手指輪流點一下按鈕,速度越快越好。"; +"TAPPING_INTRO_TEXT_2_REST_PHONE" = "將您的電話置於平坦的表面上。"; +"TAPPING_INTRO_TEXT_2_MOST_AFFECTED" = "用同一隻手的兩指來交互點按螢幕上的按鈕。"; +"TAPPING_INTRO_TEXT_2_RIGHT_FIRST" = "用右手的兩指來交互點按螢幕上的按鈕。"; +"TAPPING_INTRO_TEXT_2_LEFT_FIRST" = "用左手的兩指來交互點按螢幕上的按鈕。"; +"TAPPING_INTRO_TEXT_2_RIGHT_SECOND" = "現在請用右手重複執行相同的測試。"; +"TAPPING_INTRO_TEXT_2_LEFT_SECOND" = "現在請用左手重複執行相同的測試。"; +"TAPPING_INTRO_TEXT_2_FORMAT" = "先用一隻手指點按,再用另一隻手指。請試著讓兩指以平均的速率點按。持續點按 %@。"; "TAPPING_CALL_TO_ACTION" = "點一下「開始測試」來開始。"; +"TAPPING_CALL_TO_ACTION_NEXT" = "點「下一步」來開始。"; "TAP_BUTTON_TITLE" = "點一下"; "TOTAL_TAPS_LABEL" = "總計點按數量"; -"TAPPING_INSTRUCTION" = "用兩根手指來點一下按鈕,速度越快越好。"; - +"TAPPING_INSTRUCTION" = "用兩指儘可能地以相同的節奏點按按鈕。"; +"TAPPING_INSTRUCTION_RIGHT" = "用「右手」點按按鈕。"; +"TAPPING_INSTRUCTION_LEFT" = "用「左手」點按按鈕。"; +"TAPPING_SKIP_TITLE" = "略過這隻手"; /* Audio active task. */ "AUDIO_TASK_TITLE" = "聲音"; @@ -241,6 +273,9 @@ "AUDIO_INTENDED_USE" = "此活動會用電話底部的麥克風錄下您的聲音以進行評估。"; "AUDIO_TOO_LOUD_LABEL" = "太大聲了"; "AUDIO_GENERIC_ERROR_LABEL" = "無法錄音"; +"AUDIO_LEVEL_CHECK_LABEL" = "我們檢查背景噪音量,請稍候。"; +"AUDIO_TOO_LOUD_MESSAGE" = "周圍的噪音量過高,無法錄下您的聲音。請到較為安靜的位置,並再試一次。"; +"AUDIO_TOO_LOUD_ACTION_NEXT" = "準備好時,請點「下一步」。"; /* Tone audiometry active task. */ "TONE_AUDIOMETRY_TASK_TITLE" = "純音聽力檢查"; @@ -266,14 +301,14 @@ "MEMORY_GAME_GAMEPLAY_TITLE_%@" = "以圖片亮起來的順序點一下%@"; "MEMORY_GAME_GAMEPLAY_REVERSE_TITLE_%@" = "以相反的順序點一下%@"; "MEMORY_GAME_COMPLETE_TITLE" = "完成順序"; -"MEMORY_GAME_COMPLETE_MESSAGE" = "若要繼續,請點一下「下一步」"; +"MEMORY_GAME_COMPLETE_MESSAGE" = "若要繼續,請點「下一步」"; "MEMORY_GAME_FAILED_TITLE" = "再試一次"; -"MEMORY_GAME_FAILED_MESSAGE" = "您這次未成功。點一下「下一步」來繼續。"; +"MEMORY_GAME_FAILED_MESSAGE" = "您這次未成功。點「下一步」來繼續。"; "MEMORY_GAME_TIMEOUT_TITLE" = "時間到了"; -"MEMORY_GAME_TIMEOUT_MESSAGE" = "您的時間用完了。\n點一下「下一步」來繼續。"; +"MEMORY_GAME_TIMEOUT_MESSAGE" = "您的時間用完了。\n點「下一步」來繼續。"; "MEMORY_GAME_COMPLETE" = "遊戲完成"; "MEMORY_GAME_PAUSED_TITLE" = "已暫停"; -"MEMORY_GAME_PAUSED_MESSAGE" = "若要繼續,請點一下「下一步」"; +"MEMORY_GAME_PAUSED_MESSAGE" = "若要繼續,請點「下一步」"; /* Reaction time active task. */ "REACTION_TIME_TASK_TITLE" = "反應時間"; @@ -296,7 +331,7 @@ "TIMED_WALK_TITLE" = "定時步行"; "TIMED_WALK_INTRO_DETAIL" = "此活動會測量您的下肢功能。"; "TIMED_WALK_INTRO_2_TEXT_%@" = "請找到一個地方(最好在室外)可讓您快速安全地直線步行約 %@。通過終點線前請勿放慢速度。"; -"TIMED_WALK_INTRO_2_DETAIL" = "點一下「下一步」來開始。"; +"TIMED_WALK_INTRO_2_DETAIL" = "點「下一步」來開始。"; "TIMED_WALK_FORM_TITLE" = "輔具"; "TIMED_WALK_FORM_TEXT" = "每次測試時請使用相同的輔具。"; "TIMED_WALK_QUESTION_TEXT" = "您是否穿戴踝足副木?"; @@ -339,6 +374,48 @@ "HOLE_PEG_TEST_TEXT" = "用兩指拿起圓柱。"; "HOLE_PEG_TEST_TEXT_2" = "抬起手指來放下圓柱。"; +/* Tremor test active task. */ +"TREMOR_TEST_TITLE" = "顫抖測試活動"; +"TREMOR_TEST_INTRO_1_DETAIL" = "這項活動是測量在不同的姿勢下,您雙手顫抖的情況。請找一個可以讓您舒適坐下的位置,來完成這個活動。"; +"TREMOR_TEST_INTRO_2_DEFAULT_TEXT" = "將電話拿在較受影響的那隻手上,如下方影像所示。"; +"TREMOR_TEST_INTRO_2_RIGHT_HAND_TEXT" = "將電話拿在「右手」,如下方影像所示。"; +"TREMOR_TEST_INTRO_2_LEFT_HAND_TEXT" = "將電話拿在「左手」,如下方影像所示。"; +"TREMOR_TEST_INTRO_2_DETAIL_DEFAULT_%@" = "將會要求您在坐下時用手拿著電話執行 %@。"; +"TREMOR_TEST_INTRO_2_DETAIL_1_TASK" = "一項任務"; +"TREMOR_TEST_INTRO_2_DETAIL_2_TASK" = "兩項任務"; +"TREMOR_TEST_INTRO_2_DETAIL_3_TASK" = "三項任務"; +"TREMOR_TEST_INTRO_2_DETAIL_4_TASK" = "四項任務"; +"TREMOR_TEST_INTRO_2_DETAIL_5_TASK" = "五項任務"; +"TREMOR_TEST_ACTIVE_STEP_INTRO_TEXT" = "點「下一步」來繼續。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO" = "請準備將手放在大腿上並拿著電話。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_LEFT" = "請準備將「左手」放在大腿上並拿著電話。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INTRO_RIGHT" = "請準備將「右手」放在大腿上並拿著電話。"; +"TREMOR_TEST_ACTIVE_STEP_IN_LAP_INSTRUCTION_%ld" = "請拿著電話並放在大腿上持續 %ld 秒鐘。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO" = "現在請用手拿著電話,手伸直至與肩同高。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_LEFT" = "現在請用「左手」拿著電話,手伸直至與肩同高。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INTRO_RIGHT" = "現在請用「右手」拿著電話,手伸直至與肩同高。"; +"TREMOR_TEST_ACTIVE_STEP_EXTEND_ARM_INSTRUCTION_%ld" = "將手伸直,並拿著電話持續 %ld 秒鐘。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO" = "現在請用手拿著電話,舉至與肩同高時手肘彎曲。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_LEFT" = "現在請用「左手」拿著電話,舉至與肩同高時手肘彎曲。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INTRO_RIGHT" = "現在請用「右手」拿著電話,舉至與肩同高時手肘彎曲。"; +"TREMOR_TEST_ACTIVE_STEP_BEND_ARM_INSTRUCTION_%ld" = "繼續用手拿著電話,手肘彎曲,持續 %ld 秒鐘"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO" = "現在請將手肘保持彎曲,並重複用電話碰觸鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_LEFT" = "現在請用「左手」拿著電話,手肘保持彎曲,並重複用電話碰觸鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INTRO_RIGHT" = "現在請用「右手」拿著電話,手肘保持彎曲,並重複用電話碰觸鼻子。"; +"TREMOR_TEST_ACTIVE_STEP_TOUCH_NOSE_INSTRUCTION_%ld" = "重複用電話碰觸鼻子持續 %ld 秒鐘"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO" = "準備執行手腕轉動。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_LEFT" = "準備用「左手」拿著電話執行手腕轉動。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INTRO_RIGHT" = "準備用「右手」拿著電話執行手腕轉動。"; +"TREMOR_TEST_ACTIVE_STEP_TURN_WRIST_INSTRUCTION_%ld" = "繼續執行手腕轉動 %ld 秒鐘。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_LEFT_INSTRUCTION" = "現在請將電話換到「左手」來繼續下一項任務。"; +"TREMOR_TEST_ACTIVE_STEP_SWITCH_HANDS_RIGHT_INSTRUCTION" = "現在請將電話換到「右手」來繼續下一項任務。"; +"TREMOR_TEST_ACTIVE_STEP_FINISHED_INSTRUCTION" = "繼續下一項任務。"; +"TREMOR_TEST_COMPLETED_INSTRUCTION" = "活動已完成。"; +"TREMOR_TEST_SKIP_QUESTION_BOTH_HANDS_%@" = "將會要求您在坐下時先用一隻手拿著電話執行 %@,然後再用另一隻手執行。"; +"TREMOR_SKIP_LEFT_HAND" = "我無法用「左手」執行這項活動。"; +"TREMOR_SKIP_RIGHT_HAND" = "我無法用「右手」執行這項活動。"; +"TREMOR_SKIP_NEITHER" = "我可以用兩隻手執行這項活動。"; + /* Potentially user visible error messages. */ "ERROR_DATALOGGER_CREATE_FILE" = "無法製作檔案"; "ERROR_DATALOGGER_COULD_NOT_FREE_SPACE" = "無法移除足夠的記錄檔來達到臨界值"; @@ -378,6 +455,9 @@ "AX_IMAGE_CAPTURE_LABEL" = "擷取預覽"; "AX_IMAGE_CAPTURED_LABEL" = "擷取的影像"; +"AX_VIDEO_CAPTURE_LABEL" = "擷取影像預覽"; +"AX_VIDEO_CAPTURED_LABEL" = "擷取的影像"; + "AX_TOWER_OF_HANOI_INVALID_MOVE_FORMAT" = "無法將 %@ 號的圓盤放在 %@ 號的圓盤上"; "AX_TOWER_OF_HANOI_TARGET_DISK" = "目標"; "AX_TOWER_OF_HANOI_TOWER" = "塔座"; @@ -386,6 +466,7 @@ "AX_TOWER_OF_HANOI_TOWER_CONTAINS" = "圓盤大小是 %@"; "AX_TOWER_OF_HANOI_TOWER_EMPTY" = "空白"; -"AX_GRAPH_RANGE_FORMAT" = "範圍在 %@ 到 %@ 之間"; +"AX_GRAPH_RANGE_FORMAT_%@_%@" = "範圍在 %@ 到 %@ 之間"; +"AX_GRAPH_STACK_PREFIX" = "圓盤組成:"; "AX_GRAPH_AND_SEPARATOR" = " 和 "; "AX_GRAPH_POINT_%@" = "點:%@"; diff --git a/ResearchKit/Localized/zh_TW.lproj/locversion.plist b/ResearchKit/Localized/zh_TW.lproj/locversion.plist index 8f532f42..e7396954 100644 --- a/ResearchKit/Localized/zh_TW.lproj/locversion.plist +++ b/ResearchKit/Localized/zh_TW.lproj/locversion.plist @@ -3,12 +3,12 @@ LprojCompatibleVersion - 15 + 19 LprojLocale zh_TW LprojRevisionLevel 1 LprojVersion - 15 + 19 diff --git a/ResearchKit/ResearchKit.h b/ResearchKit/ResearchKit.h index 6850d95d..2fb5fc39 100644 --- a/ResearchKit/ResearchKit.h +++ b/ResearchKit/ResearchKit.h @@ -46,6 +46,7 @@ #import "ORKSignatureStep.h" #import "ORKTableStep.h" #import "ORKVerificationStep.h" +#import "ORKVideoCaptureStep.h" #import "ORKVisualConsentStep.h" #import "ORKWaitStep.h" @@ -89,3 +90,7 @@ #import "ORKDiscreteGraphChartView.h" #import "ORKLineGraphChartView.h" #import "ORKPieChartView.h" + +#import "ORKDataCollectionManager.h" +#import "ORKCollector.h" + diff --git a/Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj b/Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj index 274c53c4..5991d600 100644 --- a/Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj +++ b/Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 24D002781BA2268D001BF82F /* ORKKeychainWrapperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D002771BA2268D001BF82F /* ORKKeychainWrapperTests.m */; }; 335418E91B118EAD00A38F5E /* SAMPLE_PDF_TEST.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 335418E81B118EAD00A38F5E /* SAMPLE_PDF_TEST.pdf */; }; + 866DA52E1D63D1EE00C9AF3F /* ORKDataCollectionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 866DA52D1D63D1EE00C9AF3F /* ORKDataCollectionTests.m */; }; 86717A901AC0C0FE00AC2A23 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 86717A8F1AC0C0FE00AC2A23 /* main.m */; }; 86717A931AC0C0FE00AC2A23 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 86717A921AC0C0FE00AC2A23 /* AppDelegate.m */; }; 86717A9B1AC0C0FE00AC2A23 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 86717A9A1AC0C0FE00AC2A23 /* Images.xcassets */; }; @@ -62,6 +63,7 @@ /* Begin PBXFileReference section */ 24D002771BA2268D001BF82F /* ORKKeychainWrapperTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKKeychainWrapperTests.m; sourceTree = ""; }; 335418E81B118EAD00A38F5E /* SAMPLE_PDF_TEST.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = SAMPLE_PDF_TEST.pdf; sourceTree = ""; }; + 866DA52D1D63D1EE00C9AF3F /* ORKDataCollectionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ORKDataCollectionTests.m; sourceTree = ""; }; 86717A8A1AC0C0FE00AC2A23 /* ORKTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ORKTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; 86717A8E1AC0C0FE00AC2A23 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 86717A8F1AC0C0FE00AC2A23 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -137,6 +139,7 @@ FFF010741D21F2030054B430 /* ContinueButtonExample.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = ContinueButtonExample.storyboard; path = "ORKTest/Supporting Files/ContinueButtonExample.storyboard"; sourceTree = SOURCE_ROOT; }; FF5CA60C1D272CF4001660A3 /* DragonPokerStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DragonPokerStep.h; sourceTree = ""; }; FF5CA60D1D272CF4001660A3 /* DragonPokerStep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DragonPokerStep.m; sourceTree = ""; }; + BCB0809C1B83E9B200A3F400 /* ORKTest-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ORKTest-Bridging-Header.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -209,6 +212,7 @@ 86717AA61AC0C0FE00AC2A23 /* ORKTestTests */ = { isa = PBXGroup; children = ( + 866DA52D1D63D1EE00C9AF3F /* ORKDataCollectionTests.m */, 86717AFF1AC0C93E00AC2A23 /* ORKESerialization.h */, 86717AD81AC0C53800AC2A23 /* ORKESerialization.m */, 86717AFC1AC0C86000AC2A23 /* ORKJSONSerializationTests.m */, @@ -322,11 +326,14 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = ResearchKit; TargetAttributes = { 86717A891AC0C0FE00AC2A23 = { CreatedOnToolsVersion = 6.2; + DevelopmentTeam = 7JYUG8QGJ3; + DevelopmentTeamName = "Apple Inc. - SPG-NGS"; + LastSwiftMigration = 0800; SystemCapabilities = { com.apple.BackgroundModes = { enabled = 1; @@ -455,6 +462,7 @@ buildActionMask = 2147483647; files = ( 86717AFD1AC0C86000AC2A23 /* ORKJSONSerializationTests.m in Sources */, + 866DA52E1D63D1EE00C9AF3F /* ORKDataCollectionTests.m in Sources */, 86717AFE1AC0C8BC00AC2A23 /* ORKESerialization.m in Sources */, 24D002781BA2268D001BF82F /* ORKKeychainWrapperTests.m in Sources */, ); @@ -535,6 +543,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -549,6 +558,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -571,6 +581,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -585,6 +596,7 @@ COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -607,12 +619,14 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/ORKTest/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.example.researchkit-samplecode.ORKTest"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SWIFT_OBJC_BRIDGING_HEADER = "ORKTest/Supporting Files/ORKTest-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -626,11 +640,14 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/ORKTest/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.example.researchkit-samplecode.ORKTest"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SWIFT_OBJC_BRIDGING_HEADER = "ORKTest/Supporting Files/ORKTest-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Testing/ORKTest/ORKTest.xcodeproj/xcshareddata/xcschemes/ORKTest.xcscheme b/Testing/ORKTest/ORKTest.xcodeproj/xcshareddata/xcschemes/ORKTest.xcscheme index 2be5858a..39f67cc5 100644 --- a/Testing/ORKTest/ORKTest.xcodeproj/xcshareddata/xcschemes/ORKTest.xcscheme +++ b/Testing/ORKTest/ORKTest.xcodeproj/xcshareddata/xcschemes/ORKTest.xcscheme @@ -1,6 +1,6 @@ [UIColor] { +func randomColorArray(_ number: Int) -> [UIColor] { func random() -> CGFloat { return CGFloat(Float(arc4random()) / Float(UINT32_MAX)) @@ -48,15 +48,15 @@ let NumberOfPieChartSegments = 13 class ColorlessPieChartDataSource: NSObject, ORKPieChartViewDataSource { - func numberOfSegmentsInPieChartView(pieChartView: ORKPieChartView ) -> Int { + func numberOfSegments(in pieChartView: ORKPieChartView ) -> Int { return NumberOfPieChartSegments } - func pieChartView(pieChartView: ORKPieChartView, valueForSegmentAtIndex index: Int) -> CGFloat { + func pieChartView(_ pieChartView: ORKPieChartView, valueForSegmentAt index: Int) -> CGFloat { return CGFloat(index + 1) } - func pieChartView(pieChartView: ORKPieChartView, titleForSegmentAtIndex index: Int) -> String { + func pieChartView(_ pieChartView: ORKPieChartView, titleForSegmentAt index: Int) -> String { return "Title \(index + 1)" } } @@ -67,7 +67,7 @@ class RandomColorPieChartDataSource: ColorlessPieChartDataSource { return randomColorArray(NumberOfPieChartSegments) }() - func pieChartView(pieChartView: ORKPieChartView, colorForSegmentAtIndex index: Int) -> UIColor { + func pieChartView(_ pieChartView: ORKPieChartView, colorForSegmentAtIndex index: Int) -> UIColor { return backingStore[index] } } @@ -75,31 +75,32 @@ class RandomColorPieChartDataSource: ColorlessPieChartDataSource { class BaseFloatRangeGraphChartDataSource: NSObject, ORKValueRangeGraphChartViewDataSource { var plotPoints: [[ORKValueRange]] = [[]] - func numberOfPlotsInGraphChartView(graphChartView: ORKGraphChartView) -> Int { + internal func numberOfPlots(in graphChartView: ORKGraphChartView) -> Int { return plotPoints.count } - func graphChartView(graphChartView: ORKGraphChartView, dataPointForPointIndex pointIndex: Int, plotIndex: Int) -> ORKValueRange { + func graphChartView(_ graphChartView: ORKGraphChartView, dataPointForPointIndex pointIndex: Int, plotIndex: Int) -> ORKValueRange { return plotPoints[plotIndex][pointIndex] } - func graphChartView(graphChartView: ORKGraphChartView, numberOfDataPointsForPlotIndex plotIndex: Int) -> Int { + func graphChartView(_ graphChartView: ORKGraphChartView, numberOfDataPointsForPlotIndex plotIndex: Int) -> Int { return plotPoints[plotIndex].count } } class BaseFloatStackGraphChartDataSource: NSObject, ORKValueStackGraphChartViewDataSource { + var plotPoints: [[ORKValueStack]] = [[]] - func numberOfPlotsInGraphChartView(graphChartView: ORKGraphChartView) -> Int { + public func numberOfPlots(in graphChartView: ORKGraphChartView) -> Int { return plotPoints.count } - func graphChartView(graphChartView: ORKGraphChartView, dataPointForPointIndex pointIndex: Int, plotIndex: Int) -> ORKValueStack { + func graphChartView(_ graphChartView: ORKGraphChartView, dataPointForPointIndex pointIndex: Int, plotIndex: Int) -> ORKValueStack { return plotPoints[plotIndex][pointIndex] } - func graphChartView(graphChartView: ORKGraphChartView, numberOfDataPointsForPlotIndex plotIndex: Int) -> Int { + func graphChartView(_ graphChartView: ORKGraphChartView, numberOfDataPointsForPlotIndex plotIndex: Int) -> Int { return plotPoints[plotIndex].count } } @@ -142,43 +143,43 @@ class LineGraphChartDataSource: BaseFloatRangeGraphChartDataSource { ] } - func maximumValueForGraphChartView(graphChartView: ORKGraphChartView) -> Double { + func maximumValueForGraphChartView(_ graphChartView: ORKGraphChartView) -> Double { return 70 } - func minimumValueForGraphChartView(graphChartView: ORKGraphChartView) -> Double { + func minimumValueForGraphChartView(_ graphChartView: ORKGraphChartView) -> Double { return 0 } - func numberOfDivisionsInXAxisForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func numberOfDivisionsInXAxisForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 10 } - func graphChartView(graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String? { + func graphChartView(_ graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String? { return (pointIndex % 2 == 0) ? nil : "\(pointIndex + 1)" } - func graphChartView(graphChartView: ORKGraphChartView, drawsVerticalReferenceLineAtPointIndex pointIndex: Int) -> Bool { + func graphChartView(_ graphChartView: ORKGraphChartView, drawsVerticalReferenceLineAtPointIndex pointIndex: Int) -> Bool { return (pointIndex % 2 == 1) ? false : true } - func scrubbingPlotIndexForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func scrubbingPlotIndexForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 2 } } class ColoredLineGraphChartDataSource: LineGraphChartDataSource { - func graphChartView(graphChartView: ORKGraphChartView, colorForPlotIndex plotIndex: Int) -> UIColor { + func graphChartView(_ graphChartView: ORKGraphChartView, colorForPlotIndex plotIndex: Int) -> UIColor { let color: UIColor switch plotIndex { case 0: - color = UIColor.cyanColor() + color = UIColor.cyan case 1: - color = UIColor.magentaColor() + color = UIColor.magenta case 2: - color = UIColor.yellowColor() + color = UIColor.yellow default: - color = UIColor.redColor() + color = UIColor.red } return color } @@ -187,13 +188,13 @@ class ColoredLineGraphChartDataSource: LineGraphChartDataSource { let color: UIColor switch plotIndex { case 0: - color = UIColor.blueColor().colorWithAlphaComponent(0.6) + color = UIColor.blue.withAlphaComponent(0.6) case 1: - color = UIColor.redColor().colorWithAlphaComponent(0.6) + color = UIColor.red.withAlphaComponent(0.6) case 2: - color = UIColor.greenColor().colorWithAlphaComponent(0.6) + color = UIColor.green.withAlphaComponent(0.6) default: - color = UIColor.cyanColor().colorWithAlphaComponent(0.6) + color = UIColor.cyan.withAlphaComponent(0.6) } return color } @@ -232,15 +233,15 @@ class DiscreteGraphChartDataSource: BaseFloatRangeGraphChartDataSource { ] } - func numberOfDivisionsInXAxisForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func numberOfDivisionsInXAxisForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 8 } - func graphChartView(graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String { + func graphChartView(_ graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String { return "\(pointIndex + 1)" } - func scrubbingPlotIndexForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func scrubbingPlotIndexForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 2 } } @@ -250,13 +251,13 @@ class ColoredDiscreteGraphChartDataSource: DiscreteGraphChartDataSource { let color: UIColor switch plotIndex { case 0: - color = UIColor.cyanColor() + color = UIColor.cyan case 1: - color = UIColor.magentaColor() + color = UIColor.magenta case 2: - color = UIColor.yellowColor() + color = UIColor.yellow default: - color = UIColor.redColor() + color = UIColor.red } return color } @@ -304,26 +305,31 @@ class BarGraphChartDataSource: BaseFloatStackGraphChartDataSource { return "\(pointIndex + 1)" } - func scrubbingPlotIndexForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func scrubbingPlotIndexForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 2 } } class ColoredBarGraphChartDataSource: BarGraphChartDataSource { + func graphChartView(graphChartView: ORKGraphChartView, colorForPlotIndex plotIndex: Int) -> UIColor { let color: UIColor switch plotIndex { case 0: - color = UIColor.cyanColor() + color = UIColor.cyan case 1: - color = UIColor.magentaColor() + color = UIColor.magenta case 2: - color = UIColor.yellowColor() + color = UIColor.yellow default: - color = UIColor.redColor() + color = UIColor.red } return color } + + override func scrubbingPlotIndexForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { + return 1 + } } class PerformanceLineGraphChartDataSource: BaseFloatRangeGraphChartDataSource { @@ -433,27 +439,27 @@ class PerformanceLineGraphChartDataSource: BaseFloatRangeGraphChartDataSource { ] } - func maximumValueForGraphChartView(graphChartView: ORKGraphChartView) -> Double { + func maximumValueForGraphChartView(_ graphChartView: ORKGraphChartView) -> Double { return 70 } - func minimumValueForGraphChartView(graphChartView: ORKGraphChartView) -> Double { + func minimumValueForGraphChartView(_ graphChartView: ORKGraphChartView) -> Double { return 0 } - func numberOfDivisionsInXAxisForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func numberOfDivisionsInXAxisForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 10 } - func graphChartView(graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String? { + func graphChartView(_ graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String? { return (pointIndex % 2 == 0) ? nil : "\(pointIndex + 1)" } - func graphChartView(graphChartView: ORKGraphChartView, drawsVerticalReferenceLineAtPointIndex pointIndex: Int) -> Bool { + func graphChartView(_ graphChartView: ORKGraphChartView, drawsVerticalReferenceLineAtPointIndex pointIndex: Int) -> Bool { return (pointIndex % 2 == 1) ? false : true } - func scrubbingPlotIndexForGraphChartView(graphChartView: ORKGraphChartView) -> Int { + func scrubbingPlotIndexForGraphChartView(_ graphChartView: ORKGraphChartView) -> Int { return 2 } } diff --git a/Testing/ORKTest/ORKTest/Charts/ChartListViewController.swift b/Testing/ORKTest/ORKTest/Charts/ChartListViewController.swift index 36ad1bed..cf6a9498 100644 --- a/Testing/ORKTest/ORKTest/Charts/ChartListViewController.swift +++ b/Testing/ORKTest/ORKTest/Charts/ChartListViewController.swift @@ -32,13 +32,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import UIKit import ResearchKit -func executeAfterDelay(delay:Double, closure:()->()) { - dispatch_after( - dispatch_time( - DISPATCH_TIME_NOW, - Int64(delay * Double(NSEC_PER_SEC)) - ), - dispatch_get_main_queue(), closure) +func executeAfterDelay(_ delay:Double, closure:@escaping ()->()) { + let delayTime = DispatchTime.now() + delay + let dispatchWorkItem = DispatchWorkItem(block: closure); + DispatchQueue.main.asyncAfter( + deadline: delayTime, execute: dispatchWorkItem) } class ChartListViewController: UIViewController, UITableViewDataSource { @@ -68,60 +66,61 @@ class ChartListViewController: UIViewController, UITableViewDataSource { var barGraphChartTableViewCell: BarGraphChartTableViewCell! var chartTableViewCells: [UITableViewCell]! - @IBAction func dimiss(sender: AnyObject) { - self.dismissViewControllerAnimated(true, completion: nil) + @IBAction func dimiss(_ sender: AnyObject) { + self.dismiss(animated: true, completion: nil) } override func viewDidLoad() { self.tableView.dataSource = self; // ORKPieChartView - pieChartTableViewCell = tableView.dequeueReusableCellWithIdentifier(pieChartIdentifier) as! PieChartTableViewCell + pieChartTableViewCell = tableView.dequeueReusableCell(withIdentifier: pieChartIdentifier) as! PieChartTableViewCell let pieChartView = pieChartTableViewCell.pieChartView - pieChartView.dataSource = randomColorPieChartDataSource + pieChartView?.dataSource = randomColorPieChartDataSource // Optional custom configuration - pieChartView.title = "TITLE" - pieChartView.text = "TEXT" - pieChartView.lineWidth = 1000 - pieChartView.showsTitleAboveChart = true - pieChartView.showsPercentageLabels = false - pieChartView.drawsClockwise = false + + pieChartView?.title = "TITLE" + pieChartView?.text = "TEXT" + pieChartView?.lineWidth = 1000 + pieChartView?.showsTitleAboveChart = true + pieChartView?.showsPercentageLabels = false + pieChartView?.drawsClockwise = false executeAfterDelay(2.5) { - pieChartView.showsTitleAboveChart = false - pieChartView.lineWidth = 12 - pieChartView.title = "UPDATED" - pieChartView.text = "UPDATED TEXT" - pieChartView.titleColor = UIColor.redColor() - pieChartView.textColor = UIColor.orangeColor() + pieChartView?.showsTitleAboveChart = false + pieChartView?.lineWidth = 12 + pieChartView?.title = "UPDATED" + pieChartView?.text = "UPDATED TEXT" + pieChartView?.titleColor = UIColor.red + pieChartView?.textColor = UIColor.orange } executeAfterDelay(3.5) { - pieChartView.drawsClockwise = true - pieChartView.dataSource = self.colorlessPieChartDataSource + pieChartView?.drawsClockwise = true + pieChartView?.dataSource = self.colorlessPieChartDataSource } executeAfterDelay(4.5) { - pieChartView.showsPercentageLabels = true - pieChartView.tintColor = UIColor.purpleColor() + pieChartView?.showsPercentageLabels = true + pieChartView?.tintColor = UIColor.purple } executeAfterDelay(5.5) { - pieChartView.titleColor = nil - pieChartView.textColor = nil + pieChartView?.titleColor = nil + pieChartView?.textColor = nil } // ORKBarGraphChartView - barGraphChartTableViewCell = tableView.dequeueReusableCellWithIdentifier(barGraphChartIdentifier) as! BarGraphChartTableViewCell + barGraphChartTableViewCell = tableView.dequeueReusableCell(withIdentifier: barGraphChartIdentifier) as! BarGraphChartTableViewCell let barGraphChartView = barGraphChartTableViewCell.graphChartView as! ORKBarGraphChartView barGraphChartView.dataSource = barGraphChartDataSource executeAfterDelay(1.5) { - barGraphChartView.tintColor = UIColor.purpleColor() + barGraphChartView.tintColor = UIColor.purple barGraphChartView.showsHorizontalReferenceLines = true barGraphChartView.showsVerticalReferenceLines = true } executeAfterDelay(2.5) { - barGraphChartView.axisColor = UIColor.redColor() - barGraphChartView.verticalAxisTitleColor = UIColor.redColor() - barGraphChartView.referenceLineColor = UIColor.orangeColor() - barGraphChartView.scrubberLineColor = UIColor.blueColor() - barGraphChartView.scrubberThumbColor = UIColor.greenColor() + barGraphChartView.axisColor = UIColor.red + barGraphChartView.verticalAxisTitleColor = UIColor.red + barGraphChartView.referenceLineColor = UIColor.orange + barGraphChartView.scrubberLineColor = UIColor.blue + barGraphChartView.scrubberThumbColor = UIColor.green } executeAfterDelay(3.5) { barGraphChartView.axisColor = nil @@ -141,21 +140,21 @@ class ChartListViewController: UIViewController, UITableViewDataSource { } // ORKLineGraphChartView - lineGraphChartTableViewCell = tableView.dequeueReusableCellWithIdentifier(lineGraphChartIdentifier) as! LineGraphChartTableViewCell + lineGraphChartTableViewCell = tableView.dequeueReusableCell(withIdentifier: lineGraphChartIdentifier) as! LineGraphChartTableViewCell let lineGraphChartView = lineGraphChartTableViewCell.graphChartView as! ORKLineGraphChartView lineGraphChartView.dataSource = lineGraphChartDataSource // Optional custom configuration executeAfterDelay(1.5) { - lineGraphChartView.tintColor = UIColor.purpleColor() + lineGraphChartView.tintColor = UIColor.purple lineGraphChartView.showsHorizontalReferenceLines = true lineGraphChartView.showsVerticalReferenceLines = true } executeAfterDelay(2.5) { - lineGraphChartView.axisColor = UIColor.redColor() - lineGraphChartView.verticalAxisTitleColor = UIColor.redColor() - lineGraphChartView.referenceLineColor = UIColor.orangeColor() - lineGraphChartView.scrubberLineColor = UIColor.blueColor() - lineGraphChartView.scrubberThumbColor = UIColor.greenColor() + lineGraphChartView.axisColor = UIColor.red + lineGraphChartView.verticalAxisTitleColor = UIColor.red + lineGraphChartView.referenceLineColor = UIColor.orange + lineGraphChartView.scrubberLineColor = UIColor.blue + lineGraphChartView.scrubberThumbColor = UIColor.green } executeAfterDelay(3.5) { lineGraphChartView.axisColor = nil @@ -175,7 +174,7 @@ class ChartListViewController: UIViewController, UITableViewDataSource { } // ORKDiscreteGraphChartView - discreteGraphChartTableViewCell = tableView.dequeueReusableCellWithIdentifier(discreteGraphChartIdentifier) as! DiscreteGraphChartTableViewCell + discreteGraphChartTableViewCell = tableView.dequeueReusableCell(withIdentifier: discreteGraphChartIdentifier) as! DiscreteGraphChartTableViewCell let discreteGraphChartView = discreteGraphChartTableViewCell.graphChartView as! ORKDiscreteGraphChartView discreteGraphChartView.dataSource = discreteGraphChartDataSource // Optional custom configuration @@ -183,7 +182,7 @@ class ChartListViewController: UIViewController, UITableViewDataSource { discreteGraphChartView.showsVerticalReferenceLines = true discreteGraphChartView.drawsConnectedRanges = true executeAfterDelay(2.5) { - discreteGraphChartView.tintColor = UIColor.purpleColor() + discreteGraphChartView.tintColor = UIColor.purple } executeAfterDelay(3.5) { discreteGraphChartView.drawsConnectedRanges = false @@ -197,25 +196,25 @@ class ChartListViewController: UIViewController, UITableViewDataSource { chartTableViewCells = [pieChartTableViewCell, barGraphChartTableViewCell, lineGraphChartTableViewCell, discreteGraphChartTableViewCell] - tableView.tableFooterView = UIView(frame: CGRectZero) + tableView.tableFooterView = UIView(frame: CGRect.zero) } - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return chartTableViewCells.count } - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = chartTableViewCells[indexPath.row]; + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = chartTableViewCells[(indexPath as NSIndexPath).row]; return cell } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.view.layoutIfNeeded() - pieChartTableViewCell.pieChartView.animateWithDuration(2.5) - barGraphChartTableViewCell.graphChartView.animateWithDuration(2.5) - lineGraphChartTableViewCell.graphChartView.animateWithDuration(2.5) - discreteGraphChartTableViewCell.graphChartView.animateWithDuration(2.5) + pieChartTableViewCell.pieChartView.animate(withDuration: 0.5) + lineGraphChartTableViewCell.graphChartView.animate(withDuration: 0.5) + discreteGraphChartTableViewCell.graphChartView.animate(withDuration: 0.5) + discreteGraphChartTableViewCell.graphChartView.animate(withDuration: 2.5) } } @@ -231,15 +230,15 @@ class ChartPerformanceListViewController: UIViewController, UITableViewDataSourc var discreteGraphChartTableViewCell: DiscreteGraphChartTableViewCell! var chartTableViewCells: [UITableViewCell]! - @IBAction func dimiss(sender: AnyObject) { - self.dismissViewControllerAnimated(true, completion: nil) + @IBAction func dimiss(_ sender: AnyObject) { + self.dismiss(animated: true, completion: nil) } override func viewDidLoad() { self.tableView.dataSource = self; // ORKLineGraphChartView - lineGraphChartTableViewCell = tableView.dequeueReusableCellWithIdentifier(lineGraphChartIdentifier) as! LineGraphChartTableViewCell + lineGraphChartTableViewCell = tableView.dequeueReusableCell(withIdentifier: lineGraphChartIdentifier) as! LineGraphChartTableViewCell let lineGraphChartView = lineGraphChartTableViewCell.graphChartView as! ORKLineGraphChartView lineGraphChartView.dataSource = graphChartDataSource // Optional custom configuration @@ -247,7 +246,7 @@ class ChartPerformanceListViewController: UIViewController, UITableViewDataSourc lineGraphChartView.showsVerticalReferenceLines = true // ORKDiscreteGraphChartView - discreteGraphChartTableViewCell = tableView.dequeueReusableCellWithIdentifier(discreteGraphChartIdentifier) as! DiscreteGraphChartTableViewCell + discreteGraphChartTableViewCell = tableView.dequeueReusableCell(withIdentifier: discreteGraphChartIdentifier) as! DiscreteGraphChartTableViewCell let discreteGraphChartView = discreteGraphChartTableViewCell.graphChartView as! ORKDiscreteGraphChartView discreteGraphChartView.dataSource = graphChartDataSource // Optional custom configuration @@ -257,20 +256,20 @@ class ChartPerformanceListViewController: UIViewController, UITableViewDataSourc chartTableViewCells = [lineGraphChartTableViewCell, discreteGraphChartTableViewCell] - tableView.tableFooterView = UIView(frame: CGRectZero) + tableView.tableFooterView = UIView(frame: CGRect.zero) } - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return chartTableViewCells.count } - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = chartTableViewCells[indexPath.row]; + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = chartTableViewCells[(indexPath as NSIndexPath).row]; return cell } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - lineGraphChartTableViewCell.graphChartView.animateWithDuration(0.5) + lineGraphChartTableViewCell.graphChartView.animate(withDuration: 0.5) } } diff --git a/Testing/ORKTest/ORKTest/MainViewController.m b/Testing/ORKTest/ORKTest/MainViewController.m index a2b8679e..07552dea 100644 --- a/Testing/ORKTest/ORKTest/MainViewController.m +++ b/Testing/ORKTest/ORKTest/MainViewController.m @@ -56,6 +56,7 @@ DefineStringKey(VerificationTaskIdentifier); DefineStringKey(DatePickingTaskIdentifier); DefineStringKey(ImageCaptureTaskIdentifier); +DefineStringKey(VideoCaptureTaskIdentifier); DefineStringKey(ImageChoicesTaskIdentifier); DefineStringKey(InstantiateCustomVCTaskIdentifier); DefineStringKey(LocationTaskIdentifier); @@ -342,6 +343,7 @@ static const CGFloat HeaderSideLayoutMargin = 16.0; @[ // Question Steps @"Date Pickers", @"Image Capture", + @"Video Capture", @"Image Choices", @"Location", @"Scale", @@ -537,6 +539,8 @@ static const CGFloat HeaderSideLayoutMargin = 16.0; return [self makeImageChoicesTask]; } else if ([identifier isEqualToString:ImageCaptureTaskIdentifier]) { return [self makeImageCaptureTask]; + } else if ([identifier isEqualToString:VideoCaptureTaskIdentifier]) { + return [self makeVideoCaptureTask]; } else if ([identifier isEqualToString:TwoFingerTapTaskIdentifier]) { return [ORKOrderedTask twoFingerTappingIntervalTaskWithIdentifier:TwoFingerTapTaskIdentifier intendedUseDescription:nil @@ -2943,6 +2947,91 @@ static const CGFloat HeaderSideLayoutMargin = 16.0; [self beginTaskWithIdentifier:ImageCaptureTaskIdentifier]; } +#pragma mark - Video Capture +- (id)makeVideoCaptureTask { + NSMutableArray *steps = [NSMutableArray new]; + + /* + If implementing an video capture task like this one, remember that people will + take your instructions literally. So, be cautious. Make sure your template image + is high contrast and very visible against a variety of backgrounds. + */ + { + ORKInstructionStep *step = [[ORKInstructionStep alloc] initWithIdentifier:@"begin"]; + step.title = @"Hands"; + step.image = [[UIImage imageNamed:@"hands_solid"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + step.detailText = @"In this step we will capture 5 second videos of both of your hands"; + [steps addObject:step]; + } + + { + ORKInstructionStep *step = [[ORKInstructionStep alloc] initWithIdentifier:@"right1"]; + step.title = @"Right Hand"; + step.image = [[UIImage imageNamed:@"right_hand_solid"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + step.detailText = @"Let's start by capturing a video of your right hand"; + [steps addObject:step]; + } + + { + ORKInstructionStep *step = [[ORKInstructionStep alloc] initWithIdentifier:@"right2"]; + step.title = @"Right Hand"; + step.image = [[UIImage imageNamed:@"right_hand_outline"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + step.detailText = @"Align your right hand with the on-screen outline and record the video. Be sure to place your hand over a contrasting background. You can re-capture the video as many times as you need."; + [steps addObject:step]; + } + + { + ORKVideoCaptureStep *step = [[ORKVideoCaptureStep alloc] initWithIdentifier:@"right3"]; + step.templateImage = [UIImage imageNamed:@"right_hand_outline_big"]; + step.templateImageInsets = UIEdgeInsetsMake(0.05, 0.05, 0.05, 0.05); + step.duration = @5.0; + step.accessibilityInstructions = @"Extend your right hand, palm side down, one foot in front of your device. Tap the Start Recording button, or two-finger double tap the preview to capture the video"; + step.accessibilityHint = @"Records the video visible in the preview"; + [steps addObject:step]; + } + + { + ORKInstructionStep *step = [[ORKInstructionStep alloc] initWithIdentifier:@"left1"]; + step.title = @"Left Hand"; + step.image = [[UIImage imageNamed:@"left_hand_solid"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + step.detailText = @"Now let's capture a video of your left hand"; + [steps addObject:step]; + } + + { + ORKInstructionStep *step = [[ORKInstructionStep alloc] initWithIdentifier:@"left2"]; + step.title = @"Left Hand"; + step.image = [[UIImage imageNamed:@"left_hand_outline"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + step.detailText = @"Align your left hand with the on-screen outline and record the video. Be sure to place your hand over a contrasting background. You can re-capture the video as many times as you need."; + [steps addObject:step]; + } + + { + ORKVideoCaptureStep *step = [[ORKVideoCaptureStep alloc] initWithIdentifier:@"left3"]; + step.templateImage = [UIImage imageNamed:@"left_hand_outline_big"]; + step.templateImageInsets = UIEdgeInsetsMake(0.05, 0.05, 0.05, 0.05); + step.duration = @5.0; + step.accessibilityInstructions = @"Extend your left hand, palm side down, one foot in front of your device. Tap the Start Recording button, or two-finger double tap the preview to capture the video"; + step.accessibilityHint = @"Records the video visible in the preview"; + [steps addObject:step]; + } + + { + ORKInstructionStep *step = [[ORKInstructionStep alloc] initWithIdentifier:@"end"]; + step.title = @"Complete"; + step.detailText = @"Hand video capture complete"; + [steps addObject:step]; + } + + ORKOrderedTask *task = [[ORKOrderedTask alloc] initWithIdentifier:VideoCaptureTaskIdentifier steps:steps]; + return task; +} + +- (void)videoCaptureButtonTapped:(id)sender { + [self beginTaskWithIdentifier:VideoCaptureTaskIdentifier]; +} + + - (void)navigableOrderedTaskButtonTapped:(id)sender { [self beginTaskWithIdentifier:NavigableOrderedTaskIdentifier]; } @@ -3679,8 +3768,7 @@ stepViewControllerWillAppear:(ORKStepViewController *)stepViewController { NSLog(@"[ORKTest] task results: %@", taskViewController.result); - if (_currentDocument) - { + if (_currentDocument) { /* This demonstrates how to take a signature result, apply it to a document, and then generate a PDF From the document that includes the signature. diff --git a/Testing/ORKTest/ORKTest/ORKESerialization.m b/Testing/ORKTest/ORKTest/ORKESerialization.m index b6e0b0cf..112c41e3 100644 --- a/Testing/ORKTest/ORKTest/ORKESerialization.m +++ b/Testing/ORKTest/ORKTest/ORKESerialization.m @@ -550,6 +550,21 @@ encondingTable = PROPERTY(accessibilityHint, NSString, NSObject, YES, nil, nil), PROPERTY(accessibilityInstructions, NSString, NSObject, YES, nil, nil), })), + ENTRY(ORKVideoCaptureStep, + ^id(NSDictionary *dict, ORKESerializationPropertyGetter getter) { + return [[ORKVideoCaptureStep alloc] initWithIdentifier:GETPROP(dict, identifier)]; + }, + (@{ + PROPERTY(templateImageInsets, NSValue, NSObject, YES, + ^id(id value) { return value?dictionaryFromUIEdgeInsets(((NSValue *)value).UIEdgeInsetsValue):nil; }, + ^id(id dict) { return [NSValue valueWithUIEdgeInsets:edgeInsetsFromDictionary(dict)]; }), + PROPERTY(duration, NSNumber, NSObject, YES, nil, nil), + PROPERTY(audioMute, NSNumber, NSObject, YES, nil, nil), + PROPERTY(flashMode, NSNumber, NSObject, YES, nil, nil), + PROPERTY(devicePosition, NSNumber, NSObject, YES, nil, nil), + PROPERTY(accessibilityHint, NSString, NSObject, YES, nil, nil), + PROPERTY(accessibilityInstructions, NSString, NSObject, YES, nil, nil), + })), ENTRY(ORKSignatureStep, ^id(NSDictionary *dict, ORKESerializationPropertyGetter getter) { return [[ORKSignatureStep alloc] initWithIdentifier:GETPROP(dict, identifier)]; diff --git a/Testing/ORKTest/ORKTest/Supporting Files/Info.plist b/Testing/ORKTest/ORKTest/Supporting Files/Info.plist index 54e9da7f..d94c77ac 100644 --- a/Testing/ORKTest/ORKTest/Supporting Files/Info.plist +++ b/Testing/ORKTest/ORKTest/Supporting Files/Info.plist @@ -2,6 +2,16 @@ + NSMotionUsageDescription + Use motion sensors + NSMicrophoneUsageDescription + Test audio recording features. + NSCameraUsageDescription + Test Camera related features. + NSHealthShareUsageDescription + Test HK releated features. + NSHealthUpdateUsageDescription + Test HK releated features. CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/Testing/ORKTest/ORKTest/TaskFactory.swift b/Testing/ORKTest/ORKTest/TaskFactory.swift index 7b577409..2357f05c 100644 --- a/Testing/ORKTest/ORKTest/TaskFactory.swift +++ b/Testing/ORKTest/ORKTest/TaskFactory.swift @@ -33,7 +33,7 @@ import ResearchKit @objc class TaskFactory : NSObject { - class func makeNavigableOrderedTask(taskIdentifier : String) -> ORKNavigableOrderedTask { + class func makeNavigableOrderedTask(_ taskIdentifier : String) -> ORKNavigableOrderedTask { var steps: [ORKStep] = [] var answerFormat: ORKAnswerFormat var step: ORKStep @@ -41,31 +41,31 @@ import ResearchKit // Form step textChoices = [ - ORKTextChoice(text: "Good", value: "good"), - ORKTextChoice(text: "Bad", value: "bad") + ORKTextChoice(text: "Good", value: "good" as NSCoding & NSCopying & NSObjectProtocol), + ORKTextChoice(text: "Bad", value: "bad" as NSCoding & NSCopying & NSObjectProtocol) ] - answerFormat = ORKAnswerFormat.choiceAnswerFormatWithStyle(ORKChoiceAnswerStyle.SingleChoice, textChoices: textChoices) + answerFormat = ORKAnswerFormat.choiceAnswerFormat(with: ORKChoiceAnswerStyle.singleChoice, textChoices: textChoices) let formItemFeeling: ORKFormItem = ORKFormItem(identifier: "formFeeling", text: "How do you feel", answerFormat: answerFormat) let formItemMood: ORKFormItem = ORKFormItem(identifier: "formMood", text: "How is your mood", answerFormat: answerFormat) let formStep: ORKFormStep = ORKFormStep(identifier: "introForm") - formStep.optional = false + formStep.isOptional = false formStep.formItems = [formItemFeeling, formItemMood] steps.append(formStep) // Question steps textChoices = [ - ORKTextChoice(text: "Headache", value: "headache"), - ORKTextChoice(text: "Dizziness", value: "dizziness"), - ORKTextChoice(text: "Nausea", value: "nausea") + ORKTextChoice(text: "Headache", value: "headache" as NSCoding & NSCopying & NSObjectProtocol), + ORKTextChoice(text: "Dizziness", value: "dizziness" as NSCoding & NSCopying & NSObjectProtocol), + ORKTextChoice(text: "Nausea", value: "nausea" as NSCoding & NSCopying & NSObjectProtocol) ] - answerFormat = ORKTextChoiceAnswerFormat(style: ORKChoiceAnswerStyle.SingleChoice, textChoices: textChoices) + answerFormat = ORKTextChoiceAnswerFormat(style: ORKChoiceAnswerStyle.singleChoice, textChoices: textChoices) step = ORKQuestionStep(identifier: "symptom", title: "Which is your most severe symptom?", answer: answerFormat) - step.optional = false + step.isOptional = false steps.append(step) answerFormat = ORKAnswerFormat.booleanAnswerFormat() step = ORKQuestionStep(identifier: "severity", title: "Does your symptom interfere with your daily life?", answer: answerFormat) - step.optional = false + step.isOptional = false steps.append(step) // Instruction steps @@ -104,10 +104,10 @@ import ResearchKit // From the feel/mood form step, skip the survey if the user is feeling okay and has a good mood var resultSelector = ORKResultSelector.init(stepIdentifier: "introForm", resultIdentifier: "formFeeling"); - let predicateGoodFeeling: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResultWithResultSelector(resultSelector, expectedAnswerValue: "good") + let predicateGoodFeeling: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResult(with: resultSelector, expectedAnswerValue: "good" as NSCoding & NSCopying & NSObjectProtocol) resultSelector = ORKResultSelector.init(stepIdentifier: "introForm", resultIdentifier: "formMood"); - let predicateGoodMood: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResultWithResultSelector(resultSelector, expectedAnswerValue: "good") - let predicateGoodMoodAndFeeling: NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateGoodFeeling, predicateGoodMood]) + let predicateGoodMood: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResult(with: resultSelector, expectedAnswerValue: "good" as NSCoding & NSCopying & NSObjectProtocol) + let predicateGoodMoodAndFeeling: NSCompoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateGoodFeeling, predicateGoodMood]) predicateRule = ORKPredicateStepNavigationRule(resultPredicatesAndDestinationStepIdentifiers: [ (predicateGoodMoodAndFeeling, "survey_skipped") ]) task.setNavigationRule(predicateRule, forTriggerStepIdentifier: "introForm") @@ -122,10 +122,10 @@ import ResearchKit // @"SUBQUERY(SELF, $x, $x.identifier like 'symptom' \ // AND SUBQUERY($x.answer, $y, $y like 'headache').@count > 0).@count > 0"]; resultSelector = ORKResultSelector.init(resultIdentifier: "symptom"); - let predicateHeadache: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResultWithResultSelector(resultSelector, expectedAnswerValue: "headache") + let predicateHeadache: NSPredicate = ORKResultPredicate.predicateForChoiceQuestionResult(with: resultSelector, expectedAnswerValue: "headache" as NSCoding & NSCopying & NSObjectProtocol) // User didn't chose headache at the symptom step - let predicateNotHeadache: NSPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: predicateHeadache) + let predicateNotHeadache: NSCompoundPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: predicateHeadache) predicateRule = ORKPredicateStepNavigationRule(resultPredicatesAndDestinationStepIdentifiers: [ (predicateNotHeadache, "other_symptom") ]) @@ -138,14 +138,14 @@ import ResearchKit // [NSPredicate predicateWithFormat: // @"SUBQUERY(SELF, $x, $x.identifier like 'severity' AND $x.answer == YES).@count > 0"]; resultSelector = ORKResultSelector.init(resultIdentifier: "severity"); - let predicateSevereYes: NSPredicate = ORKResultPredicate.predicateForBooleanQuestionResultWithResultSelector(resultSelector, expectedAnswer: true) + let predicateSevereYes: NSPredicate = ORKResultPredicate.predicateForBooleanQuestionResult(with: resultSelector, expectedAnswer: true) // User chose NO at the severity step resultSelector = ORKResultSelector.init(resultIdentifier: "severity"); - let predicateSevereNo: NSPredicate = ORKResultPredicate.predicateForBooleanQuestionResultWithResultSelector(resultSelector, expectedAnswer: false) + let predicateSevereNo: NSPredicate = ORKResultPredicate.predicateForBooleanQuestionResult(with: resultSelector, expectedAnswer: false) - let predicateSevereHeadache: NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateHeadache, predicateSevereYes]) - let predicateLightHeadache: NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateHeadache, predicateSevereNo]) + let predicateSevereHeadache: NSCompoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateHeadache, predicateSevereYes]) + let predicateLightHeadache: NSCompoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateHeadache, predicateSevereNo]) predicateRule = ORKPredicateStepNavigationRule(resultPredicatesAndDestinationStepIdentifiers: [ (predicateSevereHeadache, "severe_headache"), (predicateLightHeadache, "light_headache") ]) diff --git a/Testing/ORKTest/ORKTestTests/Info.plist b/Testing/ORKTest/ORKTestTests/Info.plist index ba72822e..c782c793 100644 --- a/Testing/ORKTest/ORKTestTests/Info.plist +++ b/Testing/ORKTest/ORKTestTests/Info.plist @@ -2,6 +2,10 @@ + NSHealthShareUsageDescription + Test HK releated features. + NSHealthUpdateUsageDescription + Test HK related features. CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/Testing/ORKTest/ORKTestTests/ORKDataCollectionTests.m b/Testing/ORKTest/ORKTestTests/ORKDataCollectionTests.m new file mode 100644 index 00000000..f8c4a467 --- /dev/null +++ b/Testing/ORKTest/ORKTestTests/ORKDataCollectionTests.m @@ -0,0 +1,427 @@ +/* + Copyright (c) 2016, Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder(s) nor the names of any contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. No license is granted to the trademarks of + the copyright holders even if such marks are included in this software. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import + + +@interface ORKDataCollectionTests : XCTestCase + +@end + + +@implementation ORKDataCollectionTests { + XCTestExpectation *_completionExpectation; + XCTestExpectation *_healthCollectionExpectation; + XCTestExpectation *_corrolationCollectionExpectation; + HKHealthStore *_healthStore; + BOOL _acceptDelivery; + NSInteger _errorCount; +} + +- (BOOL)fileExistAt:(NSString *)path { + return [[NSFileManager defaultManager] fileExistsAtPath:path]; +} + +- (NSString *)documentPath { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return ([paths count] > 0) ? [paths objectAtIndex:0] : nil; +} + +- (NSString *)sourcePath { + NSString *sourcePath = [[self documentPath] stringByAppendingPathComponent:@"source"]; + [[NSFileManager defaultManager] createDirectoryAtPath:sourcePath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + return sourcePath; +} + +- (NSString *)basePath { + NSString *testPath = [[self documentPath] stringByAppendingPathComponent:@"test"]; + [[NSFileManager defaultManager] createDirectoryAtPath:testPath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + return testPath; +} + +- (NSString *)storePath { + NSString *basePath = [self basePath]; + NSString *storePath = [basePath stringByAppendingPathComponent:@"managedDataCollectionStore"]; + return storePath; +} + +- (NSString *)cleanStorePath { + NSString *storePath = [self storePath]; + [[NSFileManager defaultManager] removeItemAtPath:storePath error:nil]; + return storePath; +} + +static ORKDataCollectionManager *createManagerWithCollecters (NSURL *url, + ORKMotionActivityCollector **motionCollector, + ORKHealthCollector **healthCollector, + ORKHealthCorrelationCollector **healthCorrelationCollector, + NSError **error) { + + ORKDataCollectionManager *manager = [[ORKDataCollectionManager alloc] initWithPersistenceDirectoryURL:url]; + + NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-5]; + + ORKMotionActivityCollector *mac = [manager addMotionActivityCollectorWithStartDate:startDate error:error]; + if (motionCollector) { + *motionCollector = mac; + } + + if (error && *error) { + return nil; + } + + HKQuantityType *type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; + HKUnit *unit = [[HKUnit countUnit] unitDividedByUnit:[HKUnit minuteUnit]]; + ORKHealthCollector *hc = [manager addHealthCollectorWithSampleType:type + unit:unit + startDate:startDate + error:error]; + + if (healthCollector) { + *healthCollector = hc; + } + + if (error && *error) { + return nil; + } + + HKCorrelationType *correlationType = [HKCorrelationType correlationTypeForIdentifier:HKCorrelationTypeIdentifierBloodPressure]; + NSArray *sampleTypes = @[[HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierBloodPressureDiastolic], + [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic]]; + NSArray *units = @[[HKUnit unitFromString:@"mmHg"], [HKUnit unitFromString:@"mmHg"]]; + + ORKHealthCorrelationCollector *hcc = [manager addHealthCorrelationCollectorWithCorrelationType:correlationType + sampleTypes:sampleTypes + units:units + startDate:startDate + error:error]; + + if (healthCorrelationCollector) { + *healthCorrelationCollector = hcc; + } + + if (error && *error) { + return nil; + } + + return manager; +} + +- (void)setUp { + HKQuantityType *heartRateType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; + HKQuantityType *diastolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureDiastolic]; + HKQuantityType *systolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic]; + + NSSet *types = [NSSet setWithObjects:heartRateType, diastolicType, systolicType, nil]; + XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for grant permissions"]; + [[HKHealthStore new] requestAuthorizationToShareTypes:types readTypes:types + completion:^(BOOL success, NSError * _Nullable error) { + [expectation fulfill]; + }]; + + _acceptDelivery = YES; + + [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) { + XCTAssertNil(error); + }]; +} + +- (void)testBasicOperations { + + ORKMotionActivityCollector *motionCollector; + ORKHealthCollector *healthCollector; + ORKHealthCorrelationCollector *healthCorrelationCollector; + NSError *error; + // Create + ORKDataCollectionManager *manager = createManagerWithCollecters([NSURL fileURLWithPath:[self cleanStorePath]], + &motionCollector, + &healthCollector, + &healthCorrelationCollector, + &error); + + XCTAssertNil(error); + XCTAssertEqual(manager.collectors.count, 3); + + // Re-init + manager = [[ORKDataCollectionManager alloc] initWithPersistenceDirectoryURL:[NSURL fileURLWithPath:[self storePath]]]; + XCTAssertEqual(manager.collectors.count, 3); + + // Remove Collector + [manager removeCollector:motionCollector error:&error]; + XCTAssertNil(error); + XCTAssertEqual(manager.collectors.count, 2); + + [manager removeCollector:healthCollector error:&error]; + XCTAssertNil(error); + XCTAssertEqual(manager.collectors.count, 1); + + [manager removeCollector:healthCorrelationCollector error:&error]; + XCTAssertNil(error); + XCTAssertEqual(manager.collectors.count, 0); + +} + + +typedef NS_OPTIONS (NSInteger, SampleDataType) { + SampleDataTypeHR = 1 << 0, + SampleDataTypeBP = 1 << 1, + SampleDataTypeALL= SampleDataTypeHR|SampleDataTypeBP +}; + + +- (BOOL)insertSampleDataWithType:(SampleDataType)sampleDataType { + _healthStore = [[HKHealthStore alloc] init]; + + HKQuantityType *heartRateType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; + HKQuantityType *diastolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureDiastolic]; + HKQuantityType *systolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic]; + + HKAuthorizationStatus heartRateTypeStatus = [_healthStore authorizationStatusForType:heartRateType]; + HKAuthorizationStatus diastolicTypeStatus = [_healthStore authorizationStatusForType:diastolicType]; + HKAuthorizationStatus systolicTypeStatus = [_healthStore authorizationStatusForType:systolicType]; + + BOOL authorized = (heartRateTypeStatus == HKAuthorizationStatusSharingAuthorized + && diastolicTypeStatus == HKAuthorizationStatusSharingAuthorized + && systolicTypeStatus == HKAuthorizationStatusSharingAuthorized); + + if (authorized) { + +#if TARGET_OS_SIMULATOR + + // Each time add new data samples to simulator + NSDate *d1 = [NSDate dateWithTimeIntervalSinceNow:-2]; + NSDate *d2 = [NSDate dateWithTimeIntervalSinceNow:-1]; + + // Heart Rate + HKUnit *hrUnit = [[HKUnit countUnit] unitDividedByUnit:[HKUnit minuteUnit]]; + HKQuantity* quantity = [HKQuantity quantityWithUnit:hrUnit doubleValue:(NSInteger)([NSDate date].timeIntervalSinceReferenceDate)%100]; + HKQuantitySample *heartRateSample = [HKQuantitySample quantitySampleWithType:heartRateType quantity:quantity startDate:d1 endDate:d2]; + + NSString *identifier = HKCorrelationTypeIdentifierBloodPressure; + HKUnit *bpUnit = [HKUnit unitFromString:@"mmHg"]; + + // Blood Presure + HKQuantitySample *diastolicPressure = [HKQuantitySample quantitySampleWithType:diastolicType quantity:[HKQuantity quantityWithUnit:bpUnit doubleValue:70] startDate:d1 endDate:d2]; + HKQuantitySample *systolicPressure = [HKQuantitySample quantitySampleWithType:systolicType quantity:[HKQuantity quantityWithUnit:bpUnit doubleValue:110] startDate:d1 endDate:d2]; + + HKCorrelation *bloodPressureCorrelation = [HKCorrelation correlationWithType:[HKCorrelationType correlationTypeForIdentifier:identifier] startDate:d1 endDate:d2 objects:[NSSet setWithObjects:diastolicPressure, systolicPressure, nil]]; + + NSMutableArray *objects = [NSMutableArray new]; + if (sampleDataType & SampleDataTypeHR) { + [objects addObject:heartRateSample]; + } + if (sampleDataType & SampleDataTypeBP) { + [objects addObject:bloodPressureCorrelation]; + } + + [_healthStore saveObjects:objects withCompletion:^(BOOL success, NSError * _Nullable error) { + NSLog(@"HK sample saving = %@, error = %@", success ? @"success" : @"failed", error); + }]; + +#endif + } else { + NSLog(@"Not authorized!!!! "); + } + + return authorized; +} + +- (void)testDataCollection { + + ORKMotionActivityCollector *motionCollector; + ORKHealthCollector *healthCollector; + ORKHealthCorrelationCollector *healthCorrelationCollector; + __block NSError *error; + ORKDataCollectionManager *manager = createManagerWithCollecters([NSURL fileURLWithPath:[self cleanStorePath]], + &motionCollector, + &healthCollector, + &healthCorrelationCollector, + &error); + + manager.delegate = self; + + + // First round collection + _completionExpectation = [self expectationWithDescription:@"Expectation for collection completion"]; + +#if TARGET_OS_SIMULATOR + if ([self insertSampleDataWithType:SampleDataTypeALL]) { + _healthCollectionExpectation = [self expectationWithDescription:@"Expectation for health sample collection completion"]; + _corrolationCollectionExpectation = [self expectationWithDescription:@"Expectation for corrolation collection completion"]; + } +#endif + + [manager startCollection]; + + // Test removing collector during collection + BOOL result = [manager removeCollector:healthCollector error:&error]; + XCTAssertFalse(result); + XCTAssertNotNil(error); + XCTAssertEqual(manager.collectors.count, 3); + + + [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) { + XCTAssertNil(error); + }]; + + // Test removing collector after collection + result = [manager removeCollector:healthCollector error:&error]; + XCTAssertTrue(result); + XCTAssertNil(error); + XCTAssertEqual(manager.collectors.count, 2); + + + // Second round collection + _completionExpectation = [self expectationWithDescription:@"Expectation for collection completion"]; + +#if TARGET_OS_SIMULATOR + if ([self insertSampleDataWithType:SampleDataTypeBP]) { + // Health Collector was removed + _healthCollectionExpectation = nil; + _corrolationCollectionExpectation = [self expectationWithDescription:@"Expectation for corrolation collection completion"]; + } +#endif + + [manager startCollection]; + + [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) { + XCTAssertNil(error); + }]; + +} + +- (void)testDataCollectionWithoutCollector { + + ORKMotionActivityCollector *motionCollector; + ORKHealthCollector *healthCollector; + ORKHealthCorrelationCollector *healthCorrelationCollector; + __block NSError *error; + ORKDataCollectionManager *manager = createManagerWithCollecters([NSURL fileURLWithPath:[self cleanStorePath]], + &motionCollector, + &healthCollector, + &healthCorrelationCollector, + &error); + + manager.delegate = self; + + + [manager removeCollector:motionCollector error:&error]; + [manager removeCollector:healthCollector error:&error]; + [manager removeCollector:healthCorrelationCollector error:&error]; + + _completionExpectation = [self expectationWithDescription:@"Expectation for collection completion"]; + + [manager startCollection]; + + [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) { + XCTAssertNil(error); + }]; +} + +- (void)testDelegateRejectDelivery { + _acceptDelivery = NO; + _errorCount = 0; +#if TARGET_OS_SIMULATOR + if ([self insertSampleDataWithType:SampleDataTypeALL]) { + _healthCollectionExpectation = [self expectationWithDescription:@"Expectation for health sample collection completion"]; + _corrolationCollectionExpectation = [self expectationWithDescription:@"Expectation for corrolation collection completion"]; + } +#endif + + ORKMotionActivityCollector *motionCollector; + ORKHealthCollector *healthCollector; + ORKHealthCorrelationCollector *healthCorrelationCollector; + __block NSError *error; + ORKDataCollectionManager *manager = createManagerWithCollecters([NSURL fileURLWithPath:[self cleanStorePath]], + &motionCollector, + &healthCollector, + &healthCorrelationCollector, + &error); + + manager.delegate = self; + _completionExpectation = [self expectationWithDescription:@"Expectation for collection completion"]; + + [manager startCollection]; + [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) { + XCTAssertNil(error); + }]; + XCTAssertEqual(_errorCount, 2); +} + +#pragma mark - delegate + +- (BOOL)healthCollector:(ORKHealthCollector *)collector + didCollectSamples:(NSArray *)samples { + + XCTAssertEqual(samples.count, 1); + [_healthCollectionExpectation fulfill]; + NSLog(@"Did collect health samples"); + return _acceptDelivery; +} + +- (BOOL)healthCorrelationCollector:(ORKHealthCorrelationCollector *)collector + didCollectCorrelations:(NSArray *)correlations { + + XCTAssertEqual(correlations.count, 1); + [_corrolationCollectionExpectation fulfill]; + NSLog(@"Did collect correlation samples"); + return _acceptDelivery; +} + +- (BOOL)motionActivityCollector:(ORKMotionActivityCollector *)collector + didCollectMotionActivities:(NSArray *)motionActivities { + + XCTAssertGreaterThan(motionActivities.count, 0); + NSLog(@"Did collect CMMotionActivity samples"); + return _acceptDelivery; +} + +- (void)dataCollectionManagerDidCompleteCollection:(ORKDataCollectionManager *)manager { + NSLog(@"dataCollectionManagerDidCompleteCollection %@", @(_acceptDelivery)); + [_completionExpectation fulfill]; +} + +- (void)collector:(ORKCollector *)collector didDetectError:(NSError *)error { + NSLog(@"didDetectError %@", error); + if (_acceptDelivery) { + XCTAssertNil(error); + } + _errorCount++; +} + +@end diff --git a/Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m b/Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m index a71e7a20..8f3370ae 100644 --- a/Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m +++ b/Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m @@ -200,6 +200,13 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ ORKLocation *location = [self initWithCoordinate:CLLocationCoordinate2DMake(2.0, 3.0) region:[[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(2.0, 3.0) radius:100.0 identifier:@"identifier"] userInput:@"addressString" addressDictionary:@{@"city":@"city", @"street":@"street"}]; return location; })); +ORK_MAKE_TEST_INIT(HKObjectType, (^{ + if (self.class == [HKQuantityType class]) { + return (HKObjectType *)[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; + } else { + return (HKObjectType *)[HKObjectType correlationTypeForIdentifier:HKCorrelationTypeIdentifierBloodPressure]; + } +})) @interface ORKJSONSerializationTests : XCTestCase @@ -301,6 +308,7 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ return [classesWithSecureCoding copy]; } +// JSON Serialization - (void)testORKSerialization { // Find all classes that are serializable this way @@ -312,7 +320,11 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ NSArray *classesExcludedForORKESerialization = @[ [ORKStepNavigationRule class], // abstract base class [ORKSkipStepNavigationRule class], // abstract base class - [ORKPredicateSkipStepNavigationRule class], // NSPredicate doesn't yet support JSON serialzation + [ORKPredicateSkipStepNavigationRule class], // NSPredicate doesn't yet support JSON serialzation + [ORKCollector class], // ORKCollector doesn't support JSON serialzation + [ORKHealthCollector class], + [ORKHealthCorrelationCollector class], + [ORKMotionActivityCollector class] ]; if ((classesExcludedForORKESerialization.count + classesWithORKSerialization.count) != classesWithSecureCoding.count) { @@ -364,6 +376,7 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ @"ORKImageChoice.normalStateImage", @"ORKImageChoice.selectedStateImage", @"ORKImageCaptureStep.templateImage", + @"ORKVideoCaptureStep.templateImage", @"ORKStep.requestedPermissions", @"ORKOrderedTask.providesBackgroundAudioPrompts", @"ORKScaleAnswerFormat.numberFormatter", @@ -459,7 +472,7 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ [instance setValue:@"blah" forKey:@"value"]; } else if ([aClass isSubclassOfClass:[ORKConsentSection class]]) { [instance setValue:[NSURL URLWithString:@"http://www.apple.com/"] forKey:@"customAnimationURL"]; - } else if ([aClass isSubclassOfClass:[ORKImageCaptureStep class]]) { + } else if ([aClass isSubclassOfClass:[ORKImageCaptureStep class]] || [aClass isSubclassOfClass:[ORKVideoCaptureStep class]]) { [instance setValue:[NSValue valueWithUIEdgeInsets:(UIEdgeInsets){1,1,1,1}] forKey:@"templateImageInsets"]; } else if ([aClass isSubclassOfClass:[ORKTimeIntervalAnswerFormat class]]) { [instance setValue:@(1) forKey:@"step"]; @@ -556,7 +569,7 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ return YES; } -- (void)testORKSecureCoding { +- (void)testSecureCoding { NSArray *classesWithSecureCoding = [self classesWithSecureCoding]; @@ -570,6 +583,9 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ @"requestedHealthKitTypesForWriting", @"healthKitUnit", @"firstResult", + @"correlationType", + @"sampleType", + @"unit" ]; NSArray *knownNotSerializedProperties = @[@"ORKConsentDocument.writer", // created on demand @"ORKConsentDocument.signatureFormatter", // created on demand @@ -593,6 +609,7 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ @"ORKImageChoice.normalStateImage", @"ORKImageChoice.selectedStateImage", @"ORKImageCaptureStep.templateImage", + @"ORKVideoCaptureStep.templateImage", @"ORKConsentSignature.signatureImage", @"ORKConsentSection.customImage", @"ORKInstructionStep.image", @@ -633,7 +650,11 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; unarchiver.requiresSecureCoding = YES; unarchiver.delegate = self; - id newInstance = [unarchiver decodeObjectOfClasses:[NSSet setWithArray:classesWithSecureCoding] forKey:NSKeyedArchiveRootObjectKey]; + NSMutableSet *decodingClasses = [NSMutableSet setWithArray:classesWithSecureCoding]; + [decodingClasses addObject:[NSDate class]]; + [decodingClasses addObject:[HKQueryAnchor class]]; + + id newInstance = [unarchiver decodeObjectOfClasses:decodingClasses forKey:NSKeyedArchiveRootObjectKey]; // Set of classes we can check for equality. Would like to get rid of this once we implement NSSet *checkableClasses = [NSSet setWithObjects:[NSNumber class], [NSString class], [NSDictionary class], [NSURL class], nil]; @@ -674,7 +695,7 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ NSKeyedUnarchiver *unarchiver2 = [[NSKeyedUnarchiver alloc] initForReadingWithData:data2]; unarchiver2.requiresSecureCoding = YES; unarchiver2.delegate = self; - id newInstance2 = [unarchiver2 decodeObjectOfClasses:[NSSet setWithArray:classesWithSecureCoding] forKey:NSKeyedArchiveRootObjectKey]; + id newInstance2 = [unarchiver2 decodeObjectOfClasses:decodingClasses forKey:NSKeyedArchiveRootObjectKey]; NSData *data3 = [NSKeyedArchiver archivedDataWithRootObject:newInstance2]; if (![data isEqualToData:data2]) { // allow breakpointing @@ -707,7 +728,8 @@ ORK_MAKE_TEST_INIT(ORKLocation, (^{ ([c isSubclassOfClass:[ORKAnswerFormat class]]) || ([c isSubclassOfClass:[ORKRecorderConfiguration class]]) || (c == [ORKLocation class]) || - (c == [ORKResultSelector class])) + (c == [ORKResultSelector class]) || + [c isSubclassOfClass:[HKObjectType class]]) { return [[c alloc] orktest_init]; } diff --git a/docs/Account/Account-template.markdown b/docs/Account/Account-template.markdown new file mode 100644 index 00000000..487e4a7b --- /dev/null +++ b/docs/Account/Account-template.markdown @@ -0,0 +1,82 @@ +# +These materials are for informational purposes only and do not constitute legal advice. You should contact an attorney to obtain advice with respect to the development of a research app and any applicable laws. + +# The Account Module +Registration is an important aspect of validating users of your ResearchKit app. The Account module provides all of the logic to perform this necessary functionality. + +The basic operations of the Account module are: + + * Registration. Here, the user can enter an email address, password, and additional information such as first and last name, gender, and date of birth. + * Verification. In order to properly vet new users, your app can opt to perform a verification step after registration. + * Login. After your user has registered and verified their registration, this operation allows them to log in to your app. + +##The Registration Step +To register new users, use the `ORKRegistrationStep` class. The resulting view shows a title and helpful registration text. There, the user can type an email address and password, along with other optional information. + +The following example specifies a registration step that includes requesting the user's full name, gender, and birthday: + + ORKRegistrationStep *registrationStep = [[ORKRegistrationStep alloc] initWithIdentifier:@"identifier" + title:@"Account Registration" text:@"Please register at this point." + options:ORKRegistrationStepIncludeGivenName | ORKRegistrationStepIncludeFamilyName | ORKRegistrationStepIncludeGender |ORKRegistrationStepIncludeDOB]; + ORKOrderedTask *task = [[ORKOrderedTask alloc] initWithIdentifier:@"registrationTask" steps:@[registrationStep]]; + ORKTaskViewController *taskViewController = [[ORKTaskViewController alloc] initWithTask:task taskRunUUID:nil]; + taskViewController.delegate = self; + [self presentViewController:taskViewController animated:YES completion:^{}]; + + +Here's how the registration view appears: + +![](Registration.png) + +After all of the information has been properly set, the user can touch the Done button to proceed. Your app is responsible for sending the user-provided data to a server to perform the actual registration. + +##The Verification Step +Email verification is a common way to validate proper registration for a user. After the user registers, your backend server can send an email to the provided email address. + +To enable email verification in your app, use a combination of the `ORKVerificationStep` class along with a subclass of the `ORKVerificationStepViewController`. Subclassing `ORKVerificationStepViewController` allows you to provide custom behavior when the user taps the Resend Email Verification button. The following code demonstrates how to set up your subclass: + + @interface MyVerificationStepViewController : ORKVerificationStepViewController + @end + + @implmentation MyVerificationStepViewController + + - (void)resendEmailButtonTapped { + // perform custom logic here + } + + @end + +Next, create a verification step and pass in the subclass object: + + ORKVerificationStep *verificationStep = [[ORKVerificationStep alloc] initWithIdentifier:@"identifier" + text:@"Please verify." + verificationViewControllerClass:[MyVerificationStepViewController class]]; + +You can then insert the step into your `ORKOrderedTask` object. When the step is executed, it instantiates the view controller and shows the following: + +![](Verification.png) + +##The Login Step +After the user has registered and has been verified, you can provide them access to further functionality in your app by helping them log in. + +Logging in requires subclassing the `ORKLoginStepViewController` class, which is similar to what you did to implement the verification step. Override the following method in your subclass so that you can add custom logic to handle the situation when the user forgets their password: + + - (void)forgotPasswordButtonTapped; + + +Here's a code snippet that shows how to create a subclass of `ORKLoginStepViewController`: + + @interface MyLoginStepViewController : ORKLoginStepViewController + @end + + @implmentation MyLoginStepViewController + + - (void)forgotPasswordButtonTapped { + // perform custom logic here + } + + @end + +When the login step is executed, the following view appears: + +![](Login.png) diff --git a/docs/Account/Login.png b/docs/Account/Login.png new file mode 100644 index 00000000..b573ae37 Binary files /dev/null and b/docs/Account/Login.png differ diff --git a/docs/Account/Registration.png b/docs/Account/Registration.png new file mode 100644 index 00000000..67bb1d50 Binary files /dev/null and b/docs/Account/Registration.png differ diff --git a/docs/Account/Verification.png b/docs/Account/Verification.png new file mode 100644 index 00000000..4488abb8 Binary files /dev/null and b/docs/Account/Verification.png differ diff --git a/docs/ActiveTasks/ActiveTasks-template.markdown b/docs/ActiveTasks/ActiveTasks-template.markdown index e1113d69..50ca8202 100644 --- a/docs/ActiveTasks/ActiveTasks-template.markdown +++ b/docs/ActiveTasks/ActiveTasks-template.markdown @@ -5,14 +5,12 @@ Active tasks invite users to perform activities under partially controlled conditions while iPhone sensors are used to collect data. -For example, an active task for analyzing gait and balance might asks -the user to walk a short distance, while collecting accelerometer -sample data on iPhone. - +For example, an active task for analyzing gait and balance might ask +the user to walk a short distance, while collecting accelerometer data on the device. ##Predefined Active Tasks -At release, the ResearchKit™ framework includes five predefined tasks, which fall into four categories: motor activities, fitness, cognition, and voice. The table below summarizes each task and describes the data it generates. +The ResearchKit™ framework includes a number of predefined tasks, which fall into six categories: motor activities, fitness, cognition, voice, audio, and hole peg. The table below summarizes each task and describes the data it generates. @@ -57,7 +55,7 @@ Accelerometer (optional) Touch activity
Correct answer
Actual sequences - + - + + + + + +
Active tasks in ResearchKit
Paced auditory and/or visual serial addition test (PSAT)
Paced Serial Addition Test (PSAT) Multi-Touch display Addition results @@ -84,23 +82,28 @@ from user
Audio Tone audiometryN/A Minimum amplitude for the user to recognize the sound
Hole PegHand dexterityMulti-Touch displayCompletion time
Move distance +
- #### Options for Predefined Tasks -You can disable the instruction or completion steps automatically -included in the framework when instantiating one of the predefined -active tasks by passing an appropriate combination of the -`ORKPredefinedTaskOption` constants. +You can disable the instruction or completion steps that are automatically +included in the framework by passing an appropriate combination of the +`ORKPredefinedTaskOption` constants when you instantiate one of the predefined +active tasks. -Other options flags can be used to exclude certain types of data +Options flags can also be used to exclude certain types of data collection if they are not needed for your study. For example, if you want the user to perform the fitness task but do not need heart rate data, use `ORKPredefinedTaskOptionExcludeHeartrate`. @@ -120,14 +123,13 @@ during the rest period. The screenshots below show how a fitness task might look. -

Instruction step giving motivation for the task.

Instruction step describing what the user must do.

Count down a specified duration to begin the task.

-

-

Displays distance and heart rate.

The rest step. This step is skipped if heart rate data is unavailable.

Confirms completion.

-

+

Instruction step giving motivation for the task.

+

Instruction step describing what the user must do.

+

Count down a specified duration to begin the task.

+

Displays distance and heart rate.

The rest step. This step is skipped if heart rate data is unavailable.

Confirms completion.

+

-All of the data is collected from public CoreMotion and HealthKit APIs on iOS, -and serialized to JSON. No analysis is applied to the data by -the ResearchKit framework. +All of the data is collected from public CoreMotion and HealthKit APIs on iOS, and serialized to JSON. No analysis is applied to the data by the ResearchKit framework. #### Audio @@ -135,22 +137,22 @@ In the audio task (see the method [ORKOrderedTask audioTaskWithIdentifier:intend recording is made. Analysis of the audio data is not included in the ResearchKit framework, but might naturally involve looking at the power spectrum and how it relates to the ability to produce certain -sounds. The ResearchKit framework uses the `AVFoundation` framework to collect this +sounds. The ResearchKit framework uses the AVFoundation framework to collect this data and to present volume indication during recording. No data analysis is done by ResearchKit; you can define your analysis on this -task according to requirements. +task according to your own requirements. The screenshots below show an example of an audio task.

Welcome ScreenInstruction step giving motivation for the task.

Instruction ScreenInstruction step describes user action during the task.

Task Completion ScreenCount down a specified duration to begin the task.

-

+

Task ScreenDisplays a graph during audio playback (Audio collection step).

Task Completion ScreenConfirms completion.

-

+

#### Gait and Balance In the gait and balance task (see the method [ORKOrderedTask shortWalkTaskWithIdentifier:intendedUseDescription:numberOfStepsPerLeg:restDuration:options]([ORKOrderedTask shortWalkTaskWithIdentifier:intendedUseDescription:numberOfStepsPerLeg:restDuration:options:])), the user walks for a short distance, which may be indoors. You might -use this semi-controlled task to collect objective measurements which +use this semi-controlled task to collect objective measurements that can be used to estimate stride length, smoothness, sway, and other aspects of the participant's walking. @@ -159,9 +161,9 @@ The screenshots below show an example of a gait and balance task.

Welcome/introduction ScreenInstruction step introducing the task.

Instruction step giving motivation and instruction for the task.

Count down a specified duration into the task.

Asking user to walk.

Asking user to walk.

Asking user to rest.

-

+

Task completion.

-

+

#### Tapping Speed @@ -176,7 +178,7 @@ The screenshots below show an example of a tapping speed task.

Welcome/introduction ScreenMotivation for the task.

Providing instruction for the task.

The user rapidly taps on the targets.

Task completion.

-

+

#### Spatial Memory @@ -188,7 +190,7 @@ can be used to assess visuospatial memory and executive function. The span (that is, the length of the pattern sequence) is automatically varied during the task, increasing after successful completion of a sequence, and decreasing after failures, in the range from `minimumSpan` to -`maximumSpan`. The `playSpeed` property lets you control the speed of sequence +`maximumSpan`. The `playSpeed` property lets you control the speed of sequence playback, and the `customTargetImage` property lets you customize the shape of the tap target. The game finishes when either `maxTests` tests have been completed, or the user has made `maxConsecutiveFailures` errors in a @@ -200,79 +202,102 @@ the game, and the touch inputs made by the user. The screenshots below show an example of a spatial memory task.

Welcome/introduction ScreenGives the purpose of the task.

Instruction stepDescribes what the user must do.

Initial sequence playback screenThe flowers light up in sequence.

-

+

Recall sequence screenThe user must recall the sequence.

Consecutive failure screenIf users make a mistake, they will be offered a new pattern.

Welcome/introduction ScreenThe user is offered a shorter sequence.

-

+

Task Completion screenTask completion.

-

+

-#### Paced Serial Addition Test (PSAT) +#### Paced Serial Addition Test (PSAT) -In a a paced serial addition test (PSAT) task (see method [ORKOrderedTask PSATTaskWithIdentifier:intendedUseDescription:presentationMode:interStimulusInterval:stimulusDuration:seriesLength:options]([ORKOrderedTask PSATTaskWithIdentifier:intendedUseDescription:presentationMode:interStimulusInterval:stimulusDuration:seriesLength:options:])), -single digits appear every 2 or 3 seconds on the screen of the device and the user must add each new digit to the one immediately before. A PSAT task measures the cognitive function that assesses auditory and/or visual information processing speed, flexibility, and the calculation ability of the user. +The Paced Serial Addition Test (PSAT) task (see method [ORKOrderedTask PSATTaskWithIdentifier:intendedUseDescription:presentationMode:interStimulusInterval:stimulusDuration:seriesLength:options]([ORKOrderedTask PSATTaskWithIdentifier:intendedUseDescription:presentationMode:interStimulusInterval:stimulusDuration:seriesLength:options:])) measures the cognitive function that assesses auditory and/or visual information processing speed, flexibility, and the calculation ability of the user. + +Single digits are presented every 2 or 3 seconds and the user must add each new digit to the one immediately before. + +There are three variations of this test: + +1. PASAT: Paced Auditory Serial Addition Test - the device speaks the digit every 2 or 3 seconds. +2. PVSAT: Paced Visual Serial Addition Test - the device shows the digit on screen. +3. PAVSAT: Paced Auditory and Visual Serial Addition Test - the device speaks the digit and shows it onscreen every 2 to 3 seconds. -The score for the PSAT task is the total number correct answers out of the number of possible correct answers. Data collected by the task is in the form of an `ORKPSATResult` object. +The score for the PSAT task is the total number correct answers out of the number of possible correct answers. Data collected by the task is in the form of an `ORKPSATResult` object. -The screenshots below show an example of a PSAT task. Note that the visual and auditory components of the task are optional. You can choose to include either of them or both. +The screenshots below show an example of a PVSAT task. Note that the visual and auditory components of the task are optional. You can choose to include either of them or both.

Welcome/introduction ScreenGives the purpose of the task.

Instruction stepDescribes what the user must do.

Countdown screenCount down a specified duration into the task.

-

+

The user must add each new digit on the screen to the one immediately prior to it.The user must add each new digit on the screen to the one immediately prior to it.

Task completion screenTask completion.

-

+

#### Reaction Time In the reaction time task (see the method [ORKOrderedTask reactionTimeTaskWithIdentifier:intendedUseDescription:maximumStimulusInterval:minimumStimulusInterval:thresholdAcceleration:numberOfAttempts:timeout:successSound:timeoutSound:failureSound:option]([ORKOrderedTask reactionTimeTaskWithIdentifier:intendedUseDescription:maximumStimulusInterval:minimumStimulusInterval:thresholdAcceleration:numberOfAttempts:timeout:successSound:timeoutSound:failureSound:options:])), -the user is asked to shake or move the device in response to a visual clue on the device's screen. The task is divided into few attempts (you can decide number of attempts). To complete an attempt in a task, the user must shake/move the device with greater acceleration as set in the property `thresholdAcceleration` within the given time. The task finishes when the user successfully completes all the attempts as instructed in the task. Use this task to evaluate a user's response to the stimulus and calculate their reaction time. +the user is asked to shake the device in response to a visual clue on the device's screen. The task is divided into a few attempts (you can decide the number of attempts). To complete an attempt in a task, the user must shake or move the device with an acceleration that is greater than the value of the `thresholdAcceleration` property within the given time. The task finishes when the user successfully completes all the attempts as instructed in the task. Use this task to evaluate a user's response to the stimulus and calculate their reaction time. -Data collected by this task is in the form of `ORKReactionTimeResult` objects. Each of these objects contain a timestamp representing the delivery of the stimulus and an `ORKFileResult` object that references the motion data collected during an attempt. To present this task, use `ORKTaskViewController` object. +Data collected by this task is in the form of `ORKReactionTimeResult` objects. Each of these objects contain a timestamp representing the delivery of the stimulus and an `ORKFileResult` object that references the motion data collected during an attempt. To present this task, use an `ORKTaskViewController` object. The screenshots below show an example of a reaction time task.

Welcome/introduction ScreenGives the purpose of the task.

Instruction stepDescribes what the user must do.

-

+

Actual task screen.Actual task.

Task completion screenTask completion.

-

+

#### Tone Audiometry In the tone audiometry task (see the method [ORKOrderedTask toneAudiometryTaskWithIdentifier:intendedUseDescription:speechInstruction:shortSpeechInstruction:toneDuration:options:]([ORKOrderedTask toneAudiometryTaskWithIdentifier:intendedUseDescription:speechInstruction:shortSpeechInstruction:toneDuration:options:])), -users are is asked to listen to some tones (using headphones connected to the device running the task) and tap the button on the screen when they hear it. These tones are of different audio frequencies, playing on different channels (left and right), with the volume being progressively increased until the user taps the button. A tone audiometry task measures different properties of a user's hearing ability, based on their reaction to a wide range of frequencies. +users are asked to listen to a series of tones (using headphones connected to the device running the task) and to tap the button on the screen when they hear each tone. These tones are of different audio frequencies, playing on different channels (left and right), with the volume being progressively increased until the user taps the button. A tone audiometry task measures different properties of a user's hearing ability, based on their reaction to a wide range of frequencies. Data collected in this task consists of audio signal amplitude for specific frequencies and channels. The screenshots below show an example of a tone audiometry task.

Gives the purpose of the task.

Describes what the user must do.

Preparing user for the task.

-

+

Count down a specified duration to begin the task.

Actual task.

Task completion.

-

+

#### Tower Of Hanoi -In the Tower of Hanoi task (see the method [ORKOrderedTask towerOfHanoiTaskWithIdentifier:intendedUseDescription:numberOfDisks:options:]([ORKOrderedTask towerOfHanoiTaskWithIdentifier:intendedUseDescription:numberOfDisks:options:])), the user is asked to solve the classic tower of hanoi puzzle in minimum number of moves. To solve the puzzle the user must move the entire stack to the highlighted platform making minimum moves. This task measures the user's problem solving skills. A Tower of Hanoi task finishes when the user completes the puzzle correctly or concedes that they cannot solve the puzzle. +In the Tower of Hanoi task (see the method [ORKOrderedTask towerOfHanoiTaskWithIdentifier:intendedUseDescription:numberOfDisks:options:]([ORKOrderedTask towerOfHanoiTaskWithIdentifier:intendedUseDescription:numberOfDisks:options:])), the user is asked to solve the classic Tower of Hanoi puzzle in a minimum number of moves. To solve the puzzle, the user must move the entire stack to the highlighted platform in as few moves as possible. This task measures the user's problem solving skills. A Tower of Hanoi task finishes when the user completes the puzzle correctly or concedes that they cannot solve the puzzle. Data collected by this task is in the form of an `ORKTowerOfHanoiResult` object. It contains every move taken by the user and indicates whether the puzzle was successfully completed or not. The screenshots below show an example of a Tower of Hanoi task.

Welcome/introduction ScreenGives the purpose of the task.

Instruction stepDescribes what the user must do.

-

+

Actual task screen.Actual task.

Task completion screenTask completion.

-

+

#### Timed Walk -In the timed walk task (see the method [ORKOrderedTask timedWalkTaskWithIdentifier:intendedUseDescription:distanceInMeters:timeLimit:options:]([ORKOrderedTask timedWalkTaskWithIdentifier:intendedUseDescription:distanceInMeters:timeLimit:options:])), the user is asked to walk for a specific distance quickly with safety. The task is immediately administered again by having the user walk the same distance in the opposite direction. The timed walk task differs from both the fitness and the short walk tasks in that the distance walked by the user is fixed. A timed walk task measures user's lower-extremity function. +In the timed walk task (see the method [ORKOrderedTask timedWalkTaskWithIdentifier:intendedUseDescription:distanceInMeters:timeLimit:options:]([ORKOrderedTask timedWalkTaskWithIdentifier:intendedUseDescription:distanceInMeters:timeLimit:options:])), the user is asked to walk for a specific distance quickly with safety. The task is immediately administered again by having the user walk the same distance in the opposite direction. The timed walk task differs from both the fitness and the short walk tasks in that the distance walked by the user is fixed. A timed walk task measures the user's lower-extremity function. The data collected by this task includes accelerometer, device motion, pedometer data, and location of the user. Note that the location is available only if the user agrees to share their location. Data collected by the task is in the form of an `ORKTimedWalkResult` object. The screenshots below show an example of a timed walk task.

Welcome/introduction ScreenGives the purpose of the task.

Gather information about the user's assistive device.Gathers information about the user's assistive device.

Instruction to perform the taskInstructions on how to perform the task.

-

+

Count down a specified duration to begin the task.Count down a specified duration to begin the task.

Actual task screenActual task screen.

Actual task screenActual task screen.

-

Task Completion screenTask completion.

-

+

Task Completion screenTask completion.

+

+ +#### 9-Hole Peg Test + +The 9-hole peg test is a two step test of hand dexterity to measure the MSFC score in Multiple Sclerosis, Parkinson's disease, or stroke. This task is well documented in the scientific literature (see Earhart et al., 2011). + +The data collected by this task includes the number of pegs, an array of move samples, and the total duration that the user spent taking the test. + +Practically speaking, this task generates a two step test in which the participant must put a variable number of pegs in a hole (the place step), and then remove them (the remove step). This task tests both hands. + +The `ORKHolePegTestPlaceStep` class represents the place step. In this step, the user uses two fingers to touch the peg and drag it into the hole using their left hand. + +The `ORKHolePegTestRemoveStep` class represents the remove step. Here, the user moves the peg over a line using two fingers on their right hand. + +The screenshots below show an example of both place and remove tasks. + +

The peg place task.

The peg remove step.

### Getting the Data @@ -298,31 +323,31 @@ a database on the device. For example: * The pedometer sensor returns a `CMPedometerData` object that provides step counts computed by the motion coprocessor on supported devices. * The accelerometer sensor returns a `CMAccelerometerData` object that provides raw accelerometer samples indicating the forces on the device. -* A fused sampled accelerometer, gyroscope, and magnetometer device motion returns a `CMDeviceMotion` object that provides information about the orientation and movement of the device. +* A `CMDeviceMotion` object provides information about the orientation and movement of the device by combining data collected from the accelerometer, gyroscope, and magnetometer. * HealthKit returns sample types, such as heart rate. -* CoreLocation returns location data, fused from GPS, Wi-Fi and cell tower information. - +* CoreLocation returns location data (combined from GPS, Wi-Fi and cell tower information). The recorders used by ResearchKit's predefined active tasks always use `NSFileProtectionCompleteUnlessOpen` while writing data to disk, and then change the file protection level on any files generated to `NSFileProtectionComplete` when recording is finished. - ## Creating New Active Tasks You can also build your own custom active tasks by creating your own custom subclasses of `ORKActiveStep` and `ORKActiveStepViewController`. In doing this, you can follow the example of -the active steps in the predefined tasks that are already in the ResearchKit framework. +the active steps in the predefined tasks that are already in the ResearchKit framework. (A helpful tutorial on creating active tasks can be found here). -Some of the steps used in the predefined tasks may also be useful to + + +Some of the steps used in the predefined tasks may also be useful as guides when you create your own tasks. For example, the `ORKCountdownStep` displays a timer that counts down with animation for the step duration. To give another example, the `ORKCompletionStep` object displays a confirmation that the task is completed.

Countdown stepExample of a countdown step.

Completion stepExample of a task completion step.

-

+

diff --git a/docs/ActiveTasks/AudioImages/AboutTaskIntroduction.png b/docs/ActiveTasks/AudioImages/AboutTaskIntroduction.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/AudioImages/AudioTaskCompletionStep.png b/docs/ActiveTasks/AudioImages/AudioTaskCompletionStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/AudioImages/AudioTaskCountdownStep.png b/docs/ActiveTasks/AudioImages/AudioTaskCountdownStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/AudioImages/AudioTaskIntroduction.png b/docs/ActiveTasks/AudioImages/AudioTaskIntroduction.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/AudioImages/AudioTaskStep.png b/docs/ActiveTasks/AudioImages/AudioTaskStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/FitnessImages/FitnessCountDownStep.png b/docs/ActiveTasks/FitnessImages/FitnessCountDownStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/FitnessImages/FitnessTaskCompletionStep.png b/docs/ActiveTasks/FitnessImages/FitnessTaskCompletionStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/FitnessImages/FitnessTaskIntroduction.png b/docs/ActiveTasks/FitnessImages/FitnessTaskIntroduction.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/FitnessImages/FitnessTaskRestStep.png b/docs/ActiveTasks/FitnessImages/FitnessTaskRestStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/FitnessImages/FitnessTaskWalkStep.png b/docs/ActiveTasks/FitnessImages/FitnessTaskWalkStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/FitnessImages/TaskIntroduction.png b/docs/ActiveTasks/FitnessImages/TaskIntroduction.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/HolePegTaskImages/HolePegPlaceStep.png b/docs/ActiveTasks/HolePegTaskImages/HolePegPlaceStep.png new file mode 100644 index 00000000..c4c49254 Binary files /dev/null and b/docs/ActiveTasks/HolePegTaskImages/HolePegPlaceStep.png differ diff --git a/docs/ActiveTasks/HolePegTaskImages/HolePegRemoveStep.png b/docs/ActiveTasks/HolePegTaskImages/HolePegRemoveStep.png new file mode 100644 index 00000000..9a280a9f Binary files /dev/null and b/docs/ActiveTasks/HolePegTaskImages/HolePegRemoveStep.png differ diff --git a/docs/ActiveTasks/PsatTaskImages/Old/PSATStep1.png_old.png b/docs/ActiveTasks/PsatTaskImages/Old/PSATStep1.png_old.png new file mode 100755 index 00000000..23ee572c Binary files /dev/null and b/docs/ActiveTasks/PsatTaskImages/Old/PSATStep1.png_old.png differ diff --git a/docs/ActiveTasks/PsatTaskImages/Old/PSATStep2.png_old.png b/docs/ActiveTasks/PsatTaskImages/Old/PSATStep2.png_old.png new file mode 100755 index 00000000..0ef038e5 Binary files /dev/null and b/docs/ActiveTasks/PsatTaskImages/Old/PSATStep2.png_old.png differ diff --git a/docs/ActiveTasks/PsatTaskImages/PSATStep1.png b/docs/ActiveTasks/PsatTaskImages/PSATStep1.png index 23ee572c..64abf46e 100644 Binary files a/docs/ActiveTasks/PsatTaskImages/PSATStep1.png and b/docs/ActiveTasks/PsatTaskImages/PSATStep1.png differ diff --git a/docs/ActiveTasks/PsatTaskImages/PSATStep2.png b/docs/ActiveTasks/PsatTaskImages/PSATStep2.png index 0ef038e5..a48ddb7c 100644 Binary files a/docs/ActiveTasks/PsatTaskImages/PSATStep2.png and b/docs/ActiveTasks/PsatTaskImages/PSATStep2.png differ diff --git a/docs/ActiveTasks/PsatTaskImages/PSATStep3.png b/docs/ActiveTasks/PsatTaskImages/PSATStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/PsatTaskImages/PSATStep4.png b/docs/ActiveTasks/PsatTaskImages/PSATStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/PsatTaskImages/PSATStep5.png b/docs/ActiveTasks/PsatTaskImages/PSATStep5.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/PsatTaskImages/PsatActivityCompletionStep.png b/docs/ActiveTasks/PsatTaskImages/PsatActivityCompletionStep.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep1.png b/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep2.png b/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep3.png b/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep4.png b/docs/ActiveTasks/ReactionTimeTaskImages/ReactionTimeStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep1.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep2.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep3.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep4.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep5.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep5.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep6.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep6.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep7.png b/docs/ActiveTasks/ShortWalkTaskImages/ShortWalkTaskStep7.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep1.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep2.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_1.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_2.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_3.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_4.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep3_4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep4.png b/docs/ActiveTasks/SpatialSpanMemoryTaskImages/SpatialMemoryTestStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TOHTaskImages/TOHStep1.png b/docs/ActiveTasks/TOHTaskImages/TOHStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TOHTaskImages/TOHStep2.png b/docs/ActiveTasks/TOHTaskImages/TOHStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TOHTaskImages/TOHStep3.png b/docs/ActiveTasks/TOHTaskImages/TOHStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TOHTaskImages/TOHStep4.png b/docs/ActiveTasks/TOHTaskImages/TOHStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep1.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep1_notification.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep1_notification.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep2.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep3.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep4.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep5.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep5.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep6.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep6.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep7.png b/docs/ActiveTasks/TimedWalkTaskImages/TimedWalkStep7.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep1.png b/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep2.png b/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep3.png b/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep4.png b/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep4.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep5.png b/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep5.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep6.png b/docs/ActiveTasks/ToneAudiometryTaskImages/ToneAudiometryTaskStep6.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep1.png b/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep1.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep2.png b/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep2.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep3.png b/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep3.png old mode 100644 new mode 100755 diff --git a/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep4.png b/docs/ActiveTasks/TwoFingerTappingTaskImages/TwoFingerTappingTaskStep4.png old mode 100644 new mode 100755 diff --git a/docs/ChartsAndGraphs/ChartsAndGraphs-template.markdown b/docs/ChartsAndGraphs/ChartsAndGraphs-template.markdown new file mode 100644 index 00000000..c293f3a1 --- /dev/null +++ b/docs/ChartsAndGraphs/ChartsAndGraphs-template.markdown @@ -0,0 +1,387 @@ +# +These materials are for informational purposes only and do not constitute legal advice. You should contact an attorney to obtain advice with respect to the development of a research app and any applicable laws. + +# Charts and Graphs +The ResearchKit framework provides classes that allow you to display data in charts and graphs. Presenting information this way can help users understand your data better and provide key insights in a visual way. + +You can use the ResearchKit classes to create five kinds of charts: + + * Pie chart (`ORKPieChartView`). A pie chart is a circular chart divided into segments, which is useful for showing the magnitude of a particular data point as it relates to the whole. For example, a task-based research app could use a pie chart to display how many of the user's daily activities are complete. + * Line graph (`ORKLineGraphChartView`). A line graph is a type of chart that displays information as a series of data points connected by a straight line. For example, you might use a line graph to display the number of steps taken by a user every day in a week. + * Multiple line graph. A multiple line graph is a type of line graph that's useful for comparing multiple data sets over time. + * Discrete graph (`ORKDiscreteGraphChartView`). A discrete graph displays information as a series of data points in which each series is evenly spaced across the axis according to a tier row index. A discrete graph chart is a good choice for displaying data within a range, such as the range of a user's heart rate over the past month. + * Discrete graph with multiple points. A discrete graph with multiple points groups together noncontinuous values, which is useful for showing relationships between different types of discrete values that occur at the same time (for example, viewing a user's blood pressure and heart rate in a single discrete graph). + +Each of these charts is shown below.  + +

Pie Chart

Line graph chart

Line graph chart with multiple lines

+

+

Discrete graph chart

Discrete graph chart with multiple points

+

+ + + +##Adding a Chart to Your App +Chart objects adhere to the Model-View-Controller (MVC) paradigm, which emphasizes separation between the data (model), the presentation of that data (view), and the class required to coordinate the data and its view (controller). This design pattern is pervasive in iOS programming and is an integral part of the charts feature. + +In a research app, the chart object (view) must be connected to a data source object (model), which is responsible for supplying the data. The chart is then presented to a view controller object (controller), which establishes the necessary connections between the data source and the view. + +To add a chart or graph to your app, first create a data source class to supply the data. Next, create a chart or graph object (such as an `ORKPieChartView` object), connect it to the data source, customize the chart object as you want, and present it in a view controller. + +###Step 1: Implementing the Data Source Protocol +The data source provides the information that a chart object needs in order to construct a chart. This communication is enforced by a contractual obligation between objects known as a *protocol*. A protocol is composed of a name and a list of methods that the data source promises to implement. + +Two types of methods exist in a protocol: *required* and *optional* methods. As you might guess, you must implement the required methods in the data source, and you can choose to implement the optional methods. In the case of ResearchKit charts, one of the required methods of the protocol provides the number of points (or segments) and another required method provides the value of each point to the chart object. The optional methods of the protocol help in further configuring data, such as color of the x-axis or segments. + +To provide the data to a chart, the data source must adopt one of two protocols: the `ORKGraphChartViewDataSource` protocol (for a graph chart) or the `ORKPieChartViewDataSource` protocol (for a pie chart). For specific examples of implementing these protocols, see [Adding a Line or Discrete Graph Chart to Your App](http://????) and [Adding a Pie Chart to Your App](http://????). + +###Step 2: Creating a Chart Object and Adding it to a View Controller +To present data in a chart, create an instance of a ResearchKit chart object, such as `ORKPieChartView` or `ORKLineGraphChartView`. To do this, first create a `UIView` object in a `UIViewController` object and change the custom class of the view to the ResearchKit chart class you want to use. + +Next, use an IBOutlet connection to link the chart view to your code. This connection between your code and the view will allow you to update the contents of the chart on demand, as well as customize its look and feel. + +Then, connect the chart view with your data source so that the chart has access to the data. For example, to connect a pie chart object with a custom data source, you can use code similar to this: + + // Connect the pie chart-view object to a data source + pieChartView.dataSource = pieChartDataSource + +###Step 3 (Optional): Customizing the Chart Object +Although the default ResearchKit charts and graphs are ready to use with your data, it's easy to customize them to suit your app. Each chart object includes several properties that let you customize its look and feel. For example, you can title the segments in a pie chart by implementing the `titleForSegmentAtIndex` method in a pie chart data source class, as shown here: + + func pieChartView(pieChartView: ORKPieChartView, titleForSegmentAtIndex index: Int) -> String { + switch index { + case 0: + return "Steps taken" + case 1: + return "Tasks completed" + case 2: + return "Surveys completed" + default: + return "task \(index + 1)" + } + } + +The code above displays the titles in the pie chart shown here: + +

+
+ +
Pie chart with custom titles.
+
+
+ + +To learn about the customizable properties of pie, line graph, and discrete graph chart objects, see `ORKPieChartView`, `ORKGraphChartView`, and `ORKDiscreteGraphChartView`. + +##Adding a Pie Chart to Your App +The data source object that provides data to a pie chart adopts the `ORKPieChartViewDataSource` protocol. To construct a pie chart, you need to know the number of segments and the value of each segment. + +To specify the number of segments in a pie chart, implement the `numberOfSegmentsInPieChartView` method, returning an integer that indicates the number of segments in the pie chart. For example, the code below specifies a pie chart that has three segments: + + func numberOfSegmentsInPieChartView(pieChartView: ORKPieChartView) -> Int { + return 3 + } + +Before you can draw the segments in a pie chart, you need to specify the value of each segment. To provide a value for each segment of the pie chart, implement the `valueForSegmentAtIndex` method. + +The values themselves are percentages whose sum should equal 100.0. For example, the code below returns the values 50, 30, and 20 for segments at indexes 0, 1, and 2 in the pie chart: + + func pieChartView(pieChartView: ORKPieChartView, valueForSegmentAtIndex index: Int) -> CGFloat { + switch index { + case 0: + return 60.0 + case 1: + return 25.0 + case 2: + return 15.0 + } + } + +You can use the optional methods in the pie chart data source protocol to help you customize the look and feel of the data in the chart. For example, you can specify a color and a title for each segment. (To learn more about using properties in the pie chart data source protocol to customize your chart, see `ORKPieChartViewDataSource`.) + +Here's an example of a pie chart data source class that includes both required and optional methods: + + class PieChartDataSource: NSObject, ORKPieChartViewDataSource { + // Specify three different colors + let colors = [ + UIColor(red: 217/225, green: 217/255, blue: 217/225, alpha: 1), + UIColor(red: 142/255, green: 142/255, blue: 147/255, alpha: 1), + UIColor(red: 244/255, green: 200/255, blue: 74/255, alpha: 1) + ] + + // Values for each of the three segments + let values = [60.0, 25.0, 15.0] + + // Required methods + func numberOfSegmentsInPieChartView(pieChartView: ORKPieChartView ) -> Int { + return colors.count + } + + func pieChartView(pieChartView: ORKPieChartView, valueForSegmentAtIndex index: Int) -> CGFloat { + return CGFloat(values[index]) + } + + // Optional methods + // Give a color to each segment in the pie chart. + func pieChartView(pieChartView: ORKPieChartView, colorForSegmentAtIndex index: Int) -> UIColor { + return colors[index] + } + + // Give a title to each segment in the pie chart + func pieChartView(pieChartView: ORKPieChartView, titleForSegmentAtIndex index: Int) -> String { + switch index { + case 0: + return "Steps taken" + case 1: + return "Tasks completed" + case 2: + return "Surveys completed" + default: + return "task \(index + 1)" + } + } + } + +After you create a pie chart data source class, create a pie chart object that presents the data it receives from the data source object. For example, the following code shows how to create a pie chart object, connect it to the data source, and customize some of its properties: + + // Create a pie chart object + @IBOutlet weak var pieChartView: ORKPieChartView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Connect the pie chart object to a data source + pieChartView.dataSource = pieChartDataSource + + // Optional custom configuration + pieChartView.showsTitleAboveChart = false + pieChartView.showsPercentageLabels = true + pieChartView.drawsClockwise = true + pieChartView.titleColor = UIColor.purpleColor() + pieChartView.textColor = UIColor.purpleColor() + pieChartView.title = "Weekly" + pieChartView.text = "Report" + pieChartView.lineWidth = 10 + pieChartView.showsPercentageLabels = true + } + +The screenshot below shows the pie chart created by the code in this section. + +
+
+Instruction step +
Pie chart.
+
+
+ + +##Adding a Line or Discrete Graph Chart to Your App +You add data to line and discrete graph by implementing methods in the `ORKGraphChartViewDataSource` protocol. There are several methods that you must implement for correct behavior. + +Line and discrete graphs can display one or more plots. A plot is a graphical representation of a relationship between two variables. + +Start by implementing the `graphChartView:numberOfPointsForPlotIndex:` method. Here, you will return the number of points for the specific plot index (a graph may have more than one plot associated with it). + +Next, implement the `graphChartView:pointForPointIndex:plotIndex:` method. In this method, you will return a `ORKRangedPoint` (which represents a ranged point used in an graph plot) for the given point index and plot index. + +An optional method that you can implement is `numberOfPlotsInGraphChartView:`. Here, you can return the number of plots for the passed graph. If you don't implement this method, one plot is assumed. + +Other optional methods allow you to provide titles as well as set minimum and maximum values for the y-axis. + +Here's an example of a data source class for a line graph. This class returns five points for the two plots that will appear on the graph: + + class LineGraphDataSource: NSObject, ORKGraphChartViewDataSource { + + var plotPoints = + [ + [ + ORKRangedPoint(value: 200), + ORKRangedPoint(value: 450), + ORKRangedPoint(value: 500), + ORKRangedPoint(value: 250), + ORKRangedPoint(value: 300), + ORKRangedPoint(value: 600), + ORKRangedPoint(value: 300), + ], + [ + ORKRangedPoint(value: 100), + ORKRangedPoint(value: 350), + ORKRangedPoint(value: 400), + ORKRangedPoint(value: 150), + ORKRangedPoint(value: 200), + ORKRangedPoint(value: 500), + ORKRangedPoint(value: 400), + ] + ] + + // Required methods + + func graphChartView(graphChartView: ORKGraphChartView, pointForPointIndex pointIndex: Int, plotIndex: Int) -> ORKRangedPoint { + + return plotPoints[plotIndex][pointIndex] + } + + func graphChartView(graphChartView: ORKGraphChartView, numberOfPointsForPlotIndex plotIndex: Int) -> Int { + return plotPoints[plotIndex].count + } + + // Optional methods + + // Returns the number of points to the graph chart view + func numberOfPlotsInGraphChartView(graphChartView: ORKGraphChartView) -> Int { + return plotPoints.count + } + + // Sets the maximum value on the y-axis + func maximumValueForGraphChartView(graphChartView: ORKGraphChartView) -> CGFloat { + return 1000 + } + + // Sets the minimum value on the y-axis + func minimumValueForGraphChartView(graphChartView: ORKGraphChartView) -> CGFloat { + return 0 + } + + // Provides titles for x-axis + func graphChartView(graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String? { + switch pointIndex { + case 0: + return "Mon" + case 1: + return "Tue" + case 2: + return "Wed" + case 3: + return "Thu" + case 4: + return "Fri" + case 5: + return "Sat" + case 6: + return "Sun" + default: + return "Day \(pointIndex + 1)" + } + } + + // Returns the color for the given plot index + func graphChartView(graphChartView: ORKGraphChartView, colorForPlotIndex plotIndex: Int) -> UIColor { + if plotIndex == 0 { + return UIColor.purpleColor() + } + } + } + +Note: A discrete graph uses the same data source protocol as a line graph, so the data source class for a discrete graph tends to look similar to the line graph data source class shown above. + +After you create the data source class for a graph, create a graph chart object to present the data. For example, the following code shows how to create a line graph chart object, connect it to the data source shown above, and customize some of its properties: + + // Create a line graph view object + @IBOutlet weak var lineGraphView: ORKLineGraphChartView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Connect the line graph view object to a data source + lineGraphView.dataSource = lineGraphChartDataSource() + + // Optional custom configuration + lineGraphView.showsHorizontalReferenceLines = true + lineGraphView.showsVerticalReferenceLines = true + lineGraphView.axisColor = UIColor.whiteColor() + lineGraphView.verticalAxisTitleColor = UIColor.orangeColor() + lineGraphView.showsHorizontalReferenceLines = true + lineGraphView.showsVerticalReferenceLines = true + lineGraphView.scrubberLineColor = UIColor.redColor() + } + +The screenshot below shows the line graph created by the code in this section. + +
+
+Instruction step +
Line graph chart
+
+
+ +To display a discrete graph chart instead of a line graph chart, you can use code similar to the code below to create a discrete graph chart object, connect it to a data source, and customize some of its properties: + + // Creating discrete graph chart-view object + @IBOutlet weak var discreteGraphChart: ORKDiscreteGraphChartView! + + //Connecting discrete graph chart-view object to a data source + let discreteGraphChartDataSource = DiscreteGraphDataSource() + + override func viewDidLoad() { + super.viewDidLoad() + + // Connect the line graph view object to a data source + discreteGraphChart.dataSource = discreteGraphChartDataSource + + // Optional custom configuration + discreteGraphChart.showsVerticalReferenceLines = true + discreteGraphChart.drawsConnectedRanges = true + } + + +The screenshot below shows a discrete graph that uses the same data source class created for the line graph chart at the beginning of this section. + +
+
+ +
Discrete graph chart
+
+
+ + +###Drawing Multiple Lines in a Graph +By default, the graph object assumes that it has a single plot to draw. To draw more than one plot on a graph, use the `numberOfPlotsInGraphChartView` method and specify the number of plots in the graph. This optional data source method is useful when you are drawing more than one plot on a graph chart. + +For example, the code below shows how a graph object can draw two plots: + + // Optional methods + func numberOfPlotsInGraphChartView(graphChartView: ORKGraphChartView) -> Int { + return 2 + } + +###Adding Titles to a Graph Chart +Titles on the x-axis and y-axis provide clarity to the presented data and are strongly encouraged. To add titles along the x-axis in a line or discrete graph, implement the `titleForXAxisAtPointIndex` method in the data source class and return the title to display adjacent to each division on the x-axis. For the y-axis, you can display maximum or minimum values using the `maximumValueForGraphChartView:` or `minimumValueForGraphChartView:` properties (to display images instead of values, use the `maximumValueImage` and `minimumValueImage` properties). + +The following code shows how to display titles on the x-axis of a discrete graph chart: + + func graphChartView(graphChartView: ORKGraphChartView, titleForXAxisAtPointIndex pointIndex: Int) -> String? { + switch pointIndex { + case 0: + return "Jan" + case 1: + return "Feb" + case 2: + return "Mar" + case 3: + return "Apr" + default: + return "Month \(pointIndex + 1)" + } + } +The code above displays the titles you can see in the discrete graph shown here: +
+
+ +
Discrete graph chart with custom titles
+
+
+ +###Supporting the Pan Gesture +By default, the graph chart object implements the pan gesture for you. When the user drags a finger along the graph in a view, a label appears above the point that's closest to the user's finger, displaying the point's value. + +You can extend the default pan gesture behavior by implementing the `ORKGraphChartViewDelegate` protocol. The graph chart view delegate protocol forwards the pan gesture events occurring within the bounds of an `ORKGraphChartView` object. + +There are three optional methods that can be implemented: + +- `graphChartViewTouchesBegan:` alerts the object when the user has started touching the graph chart view. + +- `graphChartView:touchesMovedToXPosition:` provides the position on the x-axis where the touch has moved. + +- `graphChartViewTouchesEnded:` alerts the object when the user has stopped touching the graph view. + + diff --git a/docs/ChartsAndGraphs/ChartsImages/CustomizedChart.png b/docs/ChartsAndGraphs/ChartsImages/CustomizedChart.png new file mode 100644 index 00000000..c519de7d Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/CustomizedChart.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/CustomizedLineGraph.png b/docs/ChartsAndGraphs/ChartsImages/CustomizedLineGraph.png new file mode 100644 index 00000000..7716a16a Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/CustomizedLineGraph.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/DiscreteGraphChart.png b/docs/ChartsAndGraphs/ChartsImages/DiscreteGraphChart.png new file mode 100644 index 00000000..027e79a6 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/DiscreteGraphChart.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/DiscreteGraphChart2.png b/docs/ChartsAndGraphs/ChartsImages/DiscreteGraphChart2.png new file mode 100644 index 00000000..570c3f4a Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/DiscreteGraphChart2.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/LineChart/LineChart1.png b/docs/ChartsAndGraphs/ChartsImages/LineChart/LineChart1.png new file mode 100644 index 00000000..1917201f Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/LineChart/LineChart1.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/Overview/DiscereteGraphChartMultipleLinesOverview.png b/docs/ChartsAndGraphs/ChartsImages/Overview/DiscereteGraphChartMultipleLinesOverview.png new file mode 100644 index 00000000..dadf0079 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/Overview/DiscereteGraphChartMultipleLinesOverview.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/Overview/DiscreteGraphChartOverview.png b/docs/ChartsAndGraphs/ChartsImages/Overview/DiscreteGraphChartOverview.png new file mode 100644 index 00000000..e13ee95b Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/Overview/DiscreteGraphChartOverview.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/Overview/LineGraphChartMultipleLinesOverview.png b/docs/ChartsAndGraphs/ChartsImages/Overview/LineGraphChartMultipleLinesOverview.png new file mode 100644 index 00000000..b7fcf0d7 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/Overview/LineGraphChartMultipleLinesOverview.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/Overview/LineGraphChartOverview.png b/docs/ChartsAndGraphs/ChartsImages/Overview/LineGraphChartOverview.png new file mode 100644 index 00000000..61bae4f4 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/Overview/LineGraphChartOverview.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/Overview/PieChartOverview.png b/docs/ChartsAndGraphs/ChartsImages/Overview/PieChartOverview.png new file mode 100644 index 00000000..990c466c Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/Overview/PieChartOverview.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/PieChart/CustomTitlePieChart.png b/docs/ChartsAndGraphs/ChartsImages/PieChart/CustomTitlePieChart.png new file mode 100644 index 00000000..5380aa24 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/PieChart/CustomTitlePieChart.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/PieChart/CustomizedChart.png b/docs/ChartsAndGraphs/ChartsImages/PieChart/CustomizedChart.png new file mode 100644 index 00000000..65b90003 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/PieChart/CustomizedChart.png differ diff --git a/docs/ChartsAndGraphs/ChartsImages/PieChart/chart1.png b/docs/ChartsAndGraphs/ChartsImages/PieChart/chart1.png new file mode 100644 index 00000000..aa10c2d8 Binary files /dev/null and b/docs/ChartsAndGraphs/ChartsImages/PieChart/chart1.png differ diff --git a/docs/Passcode/Passcode-template.markdown b/docs/Passcode/Passcode-template.markdown new file mode 100644 index 00000000..3e1da884 --- /dev/null +++ b/docs/Passcode/Passcode-template.markdown @@ -0,0 +1,131 @@ +# +These materials are for informational purposes only and do not constitute legal advice. You should contact an attorney to obtain advice with respect to the development of a research app and any applicable laws. + +# Passcode +ResearchKit apps often hold sensitive user data. In order to protect that data, your app can use Apple's Passcode technology from within ResearchKit. With Passcode, your users can provide a four or six digit user-selected code for access or use their fingerprint via Touch ID on devices that provide that feature. + +There are several operations that you should know about in order to support Passcode in your app: + + * Creation. This is accomplished using a step where the user enters their desired passcode twice—once to establish it and a second time to confirm it. + * Access. After the passcode is created, the app can insist on the four digit passcode or Touch ID. + * Editing. The user may want to change the passcode by editing it. + + The passcode is stored in the user's keychain on the device. + +##Creating a Passcode +The creation of a passcode starts with the creation of an `ORKPasscodeStep` object. The `ORKPasscodeStep` class inherits from the `ORKStep` class and provides step functionality that is common in ResearchKit. + +The following code demonstrates how to create a passcode step using a four digit passcode: + +First, create the step object: + + ORKPasscodeStep *passcodeStep = [[ORKPasscodeStep alloc] init]; + +Next, set the passcode type. Here, a four digit passcode is used: + + passcodeStep.passcodeType = ORKPasscodeType4Digit; + +For additional security, consider using a six digit passcode: + + passcodeStep.passcodeType = ORKPasscodeType6Digit + +After the step is created, create an `ORKOrderedTask` object. Pass a string identifier as the first parameter, and the newly created passcode step (along with any additional steps for your app) into an array as the second parameter: + + ORKOrderedTask *task = [[ORKOrderedTask alloc] initWithIdentifier:@"passcodeTask" steps:@[passcodeStep]]; + +Pass the newly created task to an `ORKTaskViewController` object and set the view controller's delegate: + + ORKTaskViewController *taskViewController = [[ORKTaskViewController alloc] initWithTask:task taskRunUUID:nil]; + taskViewController.delegate = self + +Finally, present the task view controller: + + [self presentViewController:taskViewController animated:TRUE completion:nil]; + +The user is instructed to type in a passcode twice—once for the initial passcode, and again to confirm it. Here is the initial view: + +
+ +
+ +If the confirmation fails, an alert appears indicating a mismatch. The user can then type the passcode again: + +
+ +
+ +Upon a successful match, the user is alerted that the passcode is saved. Passcodes are stored in the keychain of the device. + + +##Using the Passcode to Protect Content +With the passcode set, you can protect sensitive data in your app by enforcing user confirmation. The `ORKPasscodeViewController` class is responsible for displaying the view that requires the user to enter their passcode before proceeding. Note that a passcode *must* be set prior to enforcement, or an exception occurs. + +To enforce passcode entry, use the following class method: + + ORKPasscodeViewController * passcodeViewController; + + if ([ORKPasscodeViewController isPasscodeStoredInKeychain] == YES) { + self.passcodeViewController = [ORKPasscodeViewController passcodeAuthenticationViewControllerWithText:@"Upon success, you'll go to the next step." delegate:self]; + // present the view + } else { + } + +Your class must adhere to the `ORKPasscodeDelegate` protocol in order to know whether the passcode was entered correctly or not, or if the user canceled. + +When the view is presented, the user is prompted to enter their 4 or 6 digit passcode: + +
+ +
+ + +The following method is called if the passcode was successfully entered: + + - (void)passcodeViewControllerDidFinishWithSuccess:(UIViewController *)viewController; + +You should perform any steps that would follow a successful authentication at this point. + +If the user does not input the passcode correctly, the following method is called: + + - (void)passcodeViewControllerDidFailAuthentication:(UIViewController *)viewController; + +The `passcodeViewControllerDidFailAuthentication` method gives your app the opportunity to attempt a reauthentication or rejection of additional steps going forward. + +If you want to provide a Cancel button so that the user has the option to back out of the authentication process, implement the following method: + + - (void)passcodeViewControllerDidCancel:(UIViewController *)viewController; + +The `passcodeViewControllerDidCancel` method is also called if the user taps the Cancel button. + +##Editing an Existing Passcode +Provide users the ability to conveniently edit their passcode by using the following code: + + ORKPasscodeViewController *passcodeViewController; + + if ([ORKPasscodeViewController isPasscodeStoredInKeychain] == YES) { + self.passcodeViewController = [ORKPasscodeViewController passcodeEditingViewControllerWithText:@"Choose something unique." delegate:self passcodeType:OKPasscodeType4Digit]; + // present the view + } else { + } + +When the editing view controller appears, the user is prompted to enter their old passcode: + +
+ +
+ +If it is entered correctly, the user has the opportunity to enter a new passcode of the specified type and should enter it again to verify it. + +Note that the passcode type (four or six digit) is passed as the last parameter to the method, allowing the user's new passcode to be of a different type than their current one. + +##Adding or Removing an Existing Passcode +At times it is necessary to know if the user has already created a passcode. The following class method on the `ORKPasscodeViewController` class returns YES or NO to indicate whether or not a passcode exists: + + + (BOOL)isPasscodeStoredInKeychain; + +You can remove the user's passcode from the keychain with the following class method on the `ORKPasscodeViewController` class: + + + (BOOL)removePasscodeFromKeychain; + +The value YES is returned if the passcode was successfully removed from the keychain. + diff --git a/docs/Passcode/Passcode.png b/docs/Passcode/Passcode.png new file mode 100644 index 00000000..dcd5d537 Binary files /dev/null and b/docs/Passcode/Passcode.png differ diff --git a/docs/Passcode/Passcode_ask.png b/docs/Passcode/Passcode_ask.png new file mode 100644 index 00000000..dcd5d537 Binary files /dev/null and b/docs/Passcode/Passcode_ask.png differ diff --git a/docs/Passcode/Passcode_edit.png b/docs/Passcode/Passcode_edit.png new file mode 100644 index 00000000..558a4f7f Binary files /dev/null and b/docs/Passcode/Passcode_edit.png differ diff --git a/docs/Passcode/Passcode_retry.png b/docs/Passcode/Passcode_retry.png new file mode 100644 index 00000000..eed6159d Binary files /dev/null and b/docs/Passcode/Passcode_retry.png differ diff --git a/docs/Survey/CreatingSurveys-template.markdown b/docs/Survey/CreatingSurveys-template.markdown old mode 100644 new mode 100755 index 93c0ccfd..e343b823 --- a/docs/Survey/CreatingSurveys-template.markdown +++ b/docs/Survey/CreatingSurveys-template.markdown @@ -3,10 +3,25 @@ #Creating Surveys -A survey task is a collection of step objects (`ORKStep`) representing -a sequence of questions, such as "What medications are you taking?" or -"How many hours did you sleep last night?" You can collect results -for the individual steps or for the entire task. +A survey is composed of a sequence of questions that you use to collect data from your users. To start a survey, you create a survey task, which is a collection of step objects (`ORKStep`). Each step object handles a specific question in the survey, such as "What medications are you taking?" or +"How many hours did you sleep last night?" + +You can collect results for the individual steps or for the entire task. There are two types of survey tasks that you can create: an ordered task (`ORKOrderedTask`) and a navigable ordered task (`ORKNavigableOrderedTask`). + +In an ordered task, the order that the steps appear are always the same. +
+
+
An example of a survey that uses ordered tasks.
+
+
+ +In a navigable ordered task, the order of the tasks can change, or branch out, depending on how the user answered a question in a previous task. + +
+
+
An example of a survey that uses navigable ordered tasks.
+
+
The steps for creating a task to present a survey are: @@ -139,7 +154,7 @@ For example, the following code shows how to create a form that requests some ba [items addObject: [[ORKFormItem alloc] initWithIdentifier:kBloodTypeItemIdentifier text:@"Blood Type" - answerFormat:bloodTypeFormat]; + answerFormat:bloodTypeFormat]]; ORKAnswerFormat *dateOfBirthFormat = [ORKHealthKitCharacteristicTypeAnswerFormat @@ -148,8 +163,9 @@ For example, the following code shows how to create a form that requests some ba ORKFormItem *dateOfBirthItem = [[ORKFormItem alloc] initWithIdentifier:kDateOfBirthItemIdentifier text:@"DOB" - answerFormat:dateOfBirthFormat]; + answerFormat:dateOfBirthFormat]]; dateOfBirthItem.placeholder = @"DOB"; + dateOfBirthItem.optional = YES; [items addObject:dateOfBirthItem]; // ... And so on, adding additional items @@ -164,6 +180,8 @@ The code above gives you something like this: +The [ORKFormItem](#) has an boolean property named `optional` which affects navigation to subsequent steps. It is set to NO by default, which requires the user to set that item before they can continue. If the property is set to YES, then the user can continue to the next step without setting the item. In the above code snippet, the `optional` property is for the `dateOfBirth` object is set to YES. This lets the user continue to the next step without putting in their date of birth. + ### Answer Format In the ResearchKit™ framework, an answer format defines how the user should be asked to @@ -182,8 +200,12 @@ The screenshots below show the standard answer formats that the ResearchKit fram

Numeric answer format

TimeOfTheDay answer format

Date answer format

-

Text answer format (unlimited text entry)

Text answer format (limited text entry)

Scale answer format (vertical)

-

Email answer format

+

Text answer format (unlimited text entry)

Text answer format (limited text entry)

+

Validated text answer format

+

+

Scale answer format (vertical)

+

Email answer format

+

Location answer format

In addition to the preceding answer formats, the ResearchKit framework provides diff --git a/docs/Survey/SurveyImages/BooleanAnswerFormat.png b/docs/Survey/SurveyImages/BooleanAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/DateAnswerFormat.png b/docs/Survey/SurveyImages/DateAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/EmailAnswerFormat.png b/docs/Survey/SurveyImages/EmailAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/FormStep.png b/docs/Survey/SurveyImages/FormStep.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/FormStep_2.png b/docs/Survey/SurveyImages/FormStep_2.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/ImageChoiceAnswerFormat.png b/docs/Survey/SurveyImages/ImageChoiceAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/InstructionStep.png b/docs/Survey/SurveyImages/InstructionStep.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/LocationAnswerFormat.png b/docs/Survey/SurveyImages/LocationAnswerFormat.png new file mode 100644 index 00000000..090131dc Binary files /dev/null and b/docs/Survey/SurveyImages/LocationAnswerFormat.png differ diff --git a/docs/Survey/SurveyImages/NavigableOrderedTasks.png b/docs/Survey/SurveyImages/NavigableOrderedTasks.png new file mode 100644 index 00000000..2d334fee Binary files /dev/null and b/docs/Survey/SurveyImages/NavigableOrderedTasks.png differ diff --git a/docs/Survey/SurveyImages/NumericAnswerFormat.png b/docs/Survey/SurveyImages/NumericAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/OrderedTasks.png b/docs/Survey/SurveyImages/OrderedTasks.png new file mode 100644 index 00000000..846d7f30 Binary files /dev/null and b/docs/Survey/SurveyImages/OrderedTasks.png differ diff --git a/docs/Survey/SurveyImages/QuestionStep.png b/docs/Survey/SurveyImages/QuestionStep.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/ResultsHierarchy.png b/docs/Survey/SurveyImages/ResultsHierarchy.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/ScaleAnswerFormat.png b/docs/Survey/SurveyImages/ScaleAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/SurveyExample.png b/docs/Survey/SurveyImages/SurveyExample.png new file mode 100644 index 00000000..1d0ad483 Binary files /dev/null and b/docs/Survey/SurveyImages/SurveyExample.png differ diff --git a/docs/Survey/SurveyImages/SurveyIntroduction_1.png b/docs/Survey/SurveyImages/SurveyIntroduction_1.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/SurveyIntroduction_2.png b/docs/Survey/SurveyImages/SurveyIntroduction_2.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/TextAnswerFormat_1.png b/docs/Survey/SurveyImages/TextAnswerFormat_1.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/TextAnswerFormat_2.png b/docs/Survey/SurveyImages/TextAnswerFormat_2.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/TextChoiceAnswerFormat_1.png b/docs/Survey/SurveyImages/TextChoiceAnswerFormat_1.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/TextChoiceAnswerFormat_2.png b/docs/Survey/SurveyImages/TextChoiceAnswerFormat_2.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/TimeIntervalAnswerFormat.png b/docs/Survey/SurveyImages/TimeIntervalAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/TimeOfTheDayAnswerFormat.png b/docs/Survey/SurveyImages/TimeOfTheDayAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/ValidatedTextAnswerFormat.png b/docs/Survey/SurveyImages/ValidatedTextAnswerFormat.png new file mode 100644 index 00000000..5282f566 Binary files /dev/null and b/docs/Survey/SurveyImages/ValidatedTextAnswerFormat.png differ diff --git a/docs/Survey/SurveyImages/ValuePickerAnswerFormat.png b/docs/Survey/SurveyImages/ValuePickerAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Survey/SurveyImages/VerticalSliderAnswerFormat.png b/docs/Survey/SurveyImages/VerticalSliderAnswerFormat.png old mode 100644 new mode 100755 diff --git a/docs/Utility/Utility-template.markdown b/docs/Utility/Utility-template.markdown new file mode 100644 index 00000000..db5ec094 --- /dev/null +++ b/docs/Utility/Utility-template.markdown @@ -0,0 +1,5 @@ +# +These materials are for informational purposes only and do not constitute legal advice. You should contact an attorney to obtain advice with respect to the development of a research app and any applicable laws. + +# Utility +ResearchKit diff --git a/docs/templates/html/document-template.html b/docs/templates/html/document-template.html index 16332841..6d34c13f 100755 --- a/docs/templates/html/document-template.html +++ b/docs/templates/html/document-template.html @@ -30,10 +30,12 @@

diff --git a/docs/templates/html/hierarchy-template.html b/docs/templates/html/hierarchy-template.html index 1676ab2d..954855a4 100755 --- a/docs/templates/html/hierarchy-template.html +++ b/docs/templates/html/hierarchy-template.html @@ -30,10 +30,12 @@ diff --git a/docs/templates/html/index-template.html b/docs/templates/html/index-template.html index cc175f07..4bce8d1e 100755 --- a/docs/templates/html/index-template.html +++ b/docs/templates/html/index-template.html @@ -30,10 +30,12 @@ diff --git a/docs/templates/html/object-template.html b/docs/templates/html/object-template.html index d651b30f..7bb3768b 100644 --- a/docs/templates/html/object-template.html +++ b/docs/templates/html/object-template.html @@ -30,10 +30,12 @@