docassemble.AssemblyLine 4.6.3__tar.gz → 4.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. {docassemble_assemblyline-4.6.3/docassemble.AssemblyLine.egg-info → docassemble_assemblyline-4.8.0}/PKG-INFO +2 -2
  2. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/__init__.py +1 -0
  3. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/al_document.py +58 -36
  4. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/al_general.py +10 -1
  5. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_saved_sessions.yml +1 -1
  6. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_terms_of_use.yml +2 -4
  7. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_visual.yml +34 -21
  8. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/interview_list.yml +6 -5
  9. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/ql_baseline.yml +1 -1
  10. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/questions/test_saving_snapshots.yml +17 -0
  11. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/ar-words.yml +10 -3
  12. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/es-words.yml +11 -3
  13. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/fr-words.yml +10 -3
  14. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/ht-words.yml +16 -0
  15. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/km-words.yml +16 -0
  16. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/languages.yml +8 -1
  17. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/ne-words.yml +10 -2
  18. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/pt-words.yml +16 -0
  19. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/test_snapshots.feature +10 -0
  20. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/translation_es.xlsx +0 -0
  21. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/vi-words.yml +16 -0
  22. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/zh-Hans-words.yml +34 -0
  23. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/sources/zh-Hant-words.yml +34 -0
  24. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/al_audio.js +34 -5
  25. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/templates/exhibit_table_of_contents.docx +0 -0
  26. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/data/templates/general_cover_sheet.docx +0 -0
  27. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/sessions.py +98 -58
  28. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/test_al_document.py +57 -1
  29. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/test_al_general.py +23 -0
  30. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/test_all_imports.py +1 -0
  31. docassemble_assemblyline-4.8.0/docassemble/AssemblyLine/test_audio.py +37 -0
  32. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0/docassemble.AssemblyLine.egg-info}/PKG-INFO +2 -2
  33. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble.AssemblyLine.egg-info/SOURCES.txt +9 -0
  34. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble.AssemblyLine.egg-info/requires.txt +1 -1
  35. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/pyproject.toml +6 -4
  36. docassemble_assemblyline-4.6.3/docassemble/AssemblyLine/__init__.py +0 -1
  37. docassemble_assemblyline-4.6.3/docassemble/AssemblyLine/data/sources/translation_es.xlsx +0 -0
  38. docassemble_assemblyline-4.6.3/docassemble/AssemblyLine/data/templates/exhibit_table_of_contents.docx +0 -0
  39. docassemble_assemblyline-4.6.3/docassemble/AssemblyLine/data/templates/general_cover_sheet.docx +0 -0
  40. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/LICENSE +0 -0
  41. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/MANIFEST.in +0 -0
  42. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/README.md +0 -0
  43. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/al_courts.py +0 -0
  44. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/custom_jinja_filters.py +0 -0
  45. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_code.yml +0 -0
  46. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_document.yml +0 -0
  47. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_language.yml +0 -0
  48. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_package.yml +0 -0
  49. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_package_unstyled.yml +0 -0
  50. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_question_test.yml +0 -0
  51. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_reminders.yml +0 -0
  52. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_saved_sessions_store.yml +0 -0
  53. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/al_settings.yml +0 -0
  54. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/assembly_line.yml +0 -0
  55. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/assembly_line_unstyled.yml +0 -0
  56. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/demo_search_sessions.yml +0 -0
  57. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/feedback.yml +0 -0
  58. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/ql_catchall.yml +0 -0
  59. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/ql_namechange.yml +0 -0
  60. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/reserved_words.yml +0 -0
  61. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_al_table_document.yml +0 -0
  62. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_aladdendum.yml +0 -0
  63. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_alcourts.yml +0 -0
  64. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_aldocument.yml +0 -0
  65. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_aldocument_background_assembly.yml +0 -0
  66. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_alexhibit.yml +0 -0
  67. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_alexhibit_maxsize.yml +0 -0
  68. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_bundle_parity.yml +0 -0
  69. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_catchall.yml +0 -0
  70. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_familiar_disambiguation.yml +0 -0
  71. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_if_final.yml +0 -0
  72. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_preferred_formats.yml +0 -0
  73. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_preferred_name.yml +0 -0
  74. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_question_library.yml +0 -0
  75. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/questions/test_signature.yml +0 -0
  76. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/README.md +0 -0
  77. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/test_aldocument.feature +0 -0
  78. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_docx_1.docx +0 -0
  79. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_jpg_1.jpg +0 -0
  80. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_pdf_1.pdf +0 -0
  81. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_png_1.png +0 -0
  82. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/test_question_library.feature +0 -0
  83. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/translation_ht.xlsx +0 -0
  84. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/sources/translation_pt.xlsx +0 -0
  85. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/README.md +0 -0
  86. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/al_audio.css +0 -0
  87. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/aldocument.css +0 -0
  88. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/aldocument.js +0 -0
  89. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/interview_list.css +0 -0
  90. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/limit_upload_size.js +0 -0
  91. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/lt1-pullout-10-getting-organized.pdf +0 -0
  92. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/ma_logo.png +0 -0
  93. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/placeholder.png +0 -0
  94. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/seal.jpg +0 -0
  95. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/static/styles.css +0 -0
  96. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/README.md +0 -0
  97. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/al_basic_addendum.docx +0 -0
  98. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/exhibit_cover_sheet.docx +0 -0
  99. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/sample_word_template.docx +0 -0
  100. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/test_aldocument_docx_1.docx +0 -0
  101. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/test_aldocument_pdf_1.pdf +0 -0
  102. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/test_catchall.docx +0 -0
  103. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/data/templates/test_if_final.docx +0 -0
  104. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/language.py +0 -0
  105. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/py.typed +0 -0
  106. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/sign.py +0 -0
  107. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble/AssemblyLine/test_language.py +0 -0
  108. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble.AssemblyLine.egg-info/dependency_links.txt +0 -0
  109. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/docassemble.AssemblyLine.egg-info/top_level.txt +0 -0
  110. {docassemble_assemblyline-4.6.3 → docassemble_assemblyline-4.8.0}/setup.cfg +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassemble.AssemblyLine
3
- Version: 4.6.3
3
+ Version: 4.8.0
4
4
  Summary: Quickly go from a paper court form to a runnable, guided, step-by-step web application powered by Docassemble. Swap out branding and pre-built questions to meet your needs.
5
5
  Author-email: Suffolk Legal Innovation and Technology Lab <litlab@suffolk.edu>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://courtformsonline.org
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
- Requires-Dist: docassemble.ALToolbox>=0.16.0
10
+ Requires-Dist: docassemble.ALToolbox>=0.19.0
11
11
  Requires-Dist: docassemble.GitHubFeedbackForm>=0.4.1.1
12
12
  Dynamic: license-file
13
13
 
@@ -0,0 +1 @@
1
+ __version__ = '4.8.0'
@@ -1,6 +1,8 @@
1
- import re
2
- import os
1
+ import json
3
2
  import mimetypes
3
+ import os
4
+ import re
5
+ from html import escape
4
6
  from typing import Any, Dict, List, Literal, Union, Callable, Optional
5
7
  from docassemble.base.util import (
6
8
  Address,
@@ -175,6 +177,14 @@ def html_safe_str(the_string: str) -> str:
175
177
  return re.sub(r"[^A-Za-z0-9]+", "_", the_string)
176
178
 
177
179
 
180
+ def _javascript_href(function_name: str, *args: Any) -> str:
181
+ """Build a JavaScript URL that is safe to use in an HTML href attribute."""
182
+ return escape(
183
+ f"javascript:{function_name}({','.join(json.dumps(arg) for arg in args)})",
184
+ quote=True,
185
+ )
186
+
187
+
178
188
  def table_row(title: str, button_htmls: List[str] = []) -> str:
179
189
  """
180
190
  Generate an HTML row string for an AL document-styled table.
@@ -2408,10 +2418,11 @@ class ALDocumentBundle(DAList):
2408
2418
  al_email_input_id = "_ignore_al_doc_email_" + name
2409
2419
  al_send_button_id = "al_send_email_button_" + name
2410
2420
 
2411
- javascript_string = (
2412
- f"javascript:aldocument_send_action("
2413
- f"'{self.attr_name('send_email_action_event')}',"
2414
- f"'{al_wants_editable_input_id}','{al_email_input_id}')"
2421
+ javascript_string = _javascript_href(
2422
+ "aldocument_send_action",
2423
+ str(self.attr_name("send_email_action_event")),
2424
+ al_wants_editable_input_id,
2425
+ al_email_input_id,
2415
2426
  )
2416
2427
 
2417
2428
  # Label "email" and input field for the 1st column of the table row
@@ -2474,23 +2485,23 @@ class ALDocumentBundle(DAList):
2474
2485
  name = html_safe_str(self.instanceName) + random_suffix()
2475
2486
  al_send_button_id = "al_send_email_to_button_" + name
2476
2487
 
2488
+ formats_value: Optional[Union[str, List[str]]]
2477
2489
  if isinstance(preferred_formats, (list, tuple)):
2478
- formats_js = "[" + ",".join(f"'{fmt}'" for fmt in preferred_formats) + "]"
2490
+ formats_value = [str(fmt) for fmt in preferred_formats]
2479
2491
  elif preferred_formats:
2480
- formats_js = f"'{preferred_formats}'"
2492
+ formats_value = str(preferred_formats)
2481
2493
  else:
2482
- formats_js = "null"
2483
-
2484
- javascript_string = (
2485
- f"javascript:aldocument_send_to_action("
2486
- f"'{self.attr_name('send_email_to_action_event')}',"
2487
- f"'{editable}',"
2488
- f"'{email}',"
2489
- f"'{al_send_button_id}',"
2490
- f"'{template_name}',"
2491
- f"'{key}',"
2492
- f"{formats_js}"
2493
- f")"
2494
+ formats_value = None
2495
+
2496
+ javascript_string = _javascript_href(
2497
+ "aldocument_send_to_action",
2498
+ str(self.attr_name("send_email_to_action_event")),
2499
+ str(editable),
2500
+ str(email),
2501
+ al_send_button_id,
2502
+ str(template_name),
2503
+ str(key),
2504
+ formats_value,
2494
2505
  )
2495
2506
  send_button = action_button_html(
2496
2507
  javascript_string,
@@ -2560,22 +2571,15 @@ class ALDocumentBundle(DAList):
2560
2571
  al_email_input_id = "_ignore_al_doc_email_" + name
2561
2572
  al_send_button_id = "al_send_email_button_" + name
2562
2573
 
2563
- if isinstance(preferred_formats, (list, tuple)):
2564
- formats_js = "[" + ",".join(f"'{fmt}'" for fmt in preferred_formats) + "]"
2565
- elif preferred_formats:
2566
- formats_js = f"'{preferred_formats}'"
2567
- else:
2568
- formats_js = "null"
2569
-
2570
- javascript_string = (
2571
- f"javascript:aldocument_send_action("
2572
- f"'{self.attr_name('send_email_action_event')}',"
2573
- f"'{al_wants_editable_input_id}',"
2574
- f"'{al_email_input_id}',"
2575
- f"'{template_name}',"
2576
- f"'{key}',"
2577
- f"{formats_js}"
2578
- ")"
2574
+ formats_value = [str(fmt) for fmt in preferred_formats]
2575
+ javascript_string = _javascript_href(
2576
+ "aldocument_send_action",
2577
+ str(self.attr_name("send_email_action_event")),
2578
+ al_wants_editable_input_id,
2579
+ al_email_input_id,
2580
+ str(template_name),
2581
+ str(key),
2582
+ formats_value,
2579
2583
  )
2580
2584
 
2581
2585
  # Container of whole email section with header
@@ -2956,6 +2960,24 @@ class ALExhibit(DAObject):
2956
2960
  """
2957
2961
  return self.pages.num_pages()
2958
2962
 
2963
+ def toc_page_number(
2964
+ self, toc_pages: int = 1, include_cover_page: bool = True
2965
+ ) -> int:
2966
+ """Return the page where this exhibit's uploaded content begins.
2967
+
2968
+ ``start_page`` already includes the initial one-page table of contents and
2969
+ every preceding exhibit cover. Adjust it only for additional TOC pages and
2970
+ this exhibit's own cover page.
2971
+
2972
+ Args:
2973
+ toc_pages (int): Actual or estimated number of TOC pages.
2974
+ include_cover_page (bool): Whether this exhibit has a cover page.
2975
+
2976
+ Returns:
2977
+ int: The physical page number of the exhibit's first uploaded page.
2978
+ """
2979
+ return self.start_page + toc_pages - 1 + int(include_cover_page)
2980
+
2959
2981
  @property
2960
2982
  def complete(self) -> bool:
2961
2983
  """
@@ -2664,8 +2664,11 @@ def get_visible_al_nav_items(
2664
2664
  # For dictionaries at top level
2665
2665
  item_copy = deepcopy(item)
2666
2666
  if not str(item_copy.pop("hidden", "False")).lower() == "true": # if not hidden
2667
+ has_subsections = False
2668
+ has_visible_subsections = False
2667
2669
  for key, val in item_copy.items():
2668
2670
  if isinstance(val, list): # if value of a key is a list
2671
+ has_subsections = True
2669
2672
  new_sublist: List[Union[str, dict]] = []
2670
2673
  for subitem in val:
2671
2674
  # Add subitem strings as-is
@@ -2679,7 +2682,13 @@ def get_visible_al_nav_items(
2679
2682
  ):
2680
2683
  new_sublist.append(subitem)
2681
2684
  item_copy[key] = new_sublist
2682
- new_list.append(item_copy)
2685
+ has_visible_subsections = has_visible_subsections or bool(
2686
+ new_sublist
2687
+ )
2688
+
2689
+ # Do not show a section expander when all of its subsections are hidden.
2690
+ if not has_subsections or has_visible_subsections:
2691
+ new_list.append(item_copy)
2683
2692
  continue
2684
2693
 
2685
2694
  return new_list
@@ -195,7 +195,7 @@ code: |
195
195
  if user_logged_in():
196
196
  new_session_id = save_interview_answers(
197
197
  metadata={"title": al_sessions_snapshot_label},
198
- additional_variables_to_filter=al_sessions_additional_variables_to_filter,
198
+ additional_variables_to_filter=showifdef('al_sessions_additional_variables_to_filter', []),
199
199
  )
200
200
  log(f"Saved interview {al_sessions_snapshot_label} with id {new_session_id}")
201
201
  else:
@@ -1,9 +1,7 @@
1
1
  ---
2
2
  template: al_terms_of_use
3
- subject: ""
3
+ subject: Terms of Use and Privacy Policy
4
4
  content: |
5
- <h2 class="h5">Terms of Use and Privacy Policy</h2>
6
-
7
5
  This website is free to use.
8
6
  % if get_config("default title") and get_config("default title") != "docassemble":
9
7
  ${ get_config("default title") }
@@ -87,4 +85,4 @@ content: |
87
85
 
88
86
  Send any questions to:
89
87
 
90
- ${ get_config("server administrator contact address", get_config("server administrator email", AL_ORGANIZATION_TITLE)) }
88
+ ${ get_config("server administrator contact address", get_config("server administrator email", AL_ORGANIZATION_TITLE)) }
@@ -1,4 +1,11 @@
1
1
  ---
2
+ include:
3
+ - docassemble.ALToolbox:translation_strings.yml
4
+ ---
5
+ imports:
6
+ - json
7
+ - html
8
+ ---
2
9
  objects:
3
10
  - al_logo: DAStaticFile.using(filename="ma_logo.png", alt_text="")
4
11
  ---
@@ -89,8 +96,8 @@ code: |
89
96
  reconsider: True
90
97
  variable name: al_menu_items_default_items
91
98
  data from code:
92
- - url:
93
- url_ask(['al_start_over_confirmation','al_start_over'])
99
+ - url: |
100
+ html.escape("javascript:(function(){if(window.confirm(" + json.dumps(str(al_start_over_confirmation_question) + "\n\n" + str(al_start_over_confirmation_subquestion)) + ")){window.location.assign(" + json.dumps(url_of('new_session')) + ");}})();void(0)", quote=True)
94
101
  label: str(al_start_over_string)
95
102
  hidden: _internal.get('steps') < 2
96
103
  - url: |
@@ -125,6 +132,23 @@ template: al_start_over_string
125
132
  content: >-
126
133
  Start over
127
134
  ---
135
+ template: al_start_over_confirmation_question
136
+ content: >-
137
+ Do you want to start over?
138
+ ---
139
+ template: al_start_over_confirmation_subquestion
140
+ content: |
141
+ % if not user_logged_in():
142
+ You may lose access to your current answers. Make sure you have downloaded
143
+ any forms that you need.
144
+ % else:
145
+ You can still access your current answers by visiting the "My interviews"
146
+ page.
147
+ % endif
148
+
149
+ Confirm to start a new copy of the form you are working on, or cancel if
150
+ you want to keep working.
151
+ ---
128
152
  template: al_exit_logout_string
129
153
  content: >-
130
154
  Exit and delete my answers
@@ -420,17 +444,16 @@ content: |
420
444
  "${all_variables(special='metadata').get('title','').rstrip()}" version
421
445
  `${ package_version_number }`; AssemblyLine version `${ al_version }`.
422
446
 
423
- % if interview_metadata.get("main_interview_key"):
447
+ <% MAIN_METADATA = all_variables(special='metadata') %>
448
+ % if "original_form" not in MAIN_METADATA and interview_metadata.get("main_interview_key"):
424
449
  <%
425
450
  MAIN_METADATA = interview_metadata[interview_metadata["main_interview_key"]]
426
451
  %>
427
- % elif len(interview_metadata) > 1:
452
+ % elif "original_form" not in MAIN_METADATA and len(interview_metadata) > 1:
428
453
  <%
429
454
  del(interview_metadata["main_interview_key"]) # DADict creates the key on lookup above
430
455
  MAIN_METADATA = next(iter(interview_metadata.values()))
431
456
  %>
432
- % else:
433
- <% MAIN_METADATA = all_variables(special='metadata') %>
434
457
  % endif
435
458
  <% ORIGINAL_FORMS = MAIN_METADATA.get("original_form", []) if isinstance(MAIN_METADATA.get("original_form"), list) else ([MAIN_METADATA.get("original_form", "")] if MAIN_METADATA.get("original_form") else []) %>
436
459
 
@@ -459,18 +482,9 @@ content: |
459
482
  ---
460
483
  id: start a new session
461
484
  question: |
462
- Do you want to start over?
485
+ ${ al_start_over_confirmation_question }
463
486
  subquestion: |
464
- % if not user_logged_in():
465
- You may lose access to your current answers. Make sure you have downloaded
466
- any forms that you need.
467
- % else:
468
- You can still access your current answers by visiting the "My interviews"
469
- page.
470
- % endif
471
-
472
- Click "Start over" to start a new copy of the form you are working on,
473
- or "Back" if you want to keep working.
487
+ ${ al_start_over_confirmation_subquestion }
474
488
  back button label: |
475
489
  Back
476
490
  continue button label: |
@@ -509,17 +523,16 @@ decoration: bug
509
523
  question: |
510
524
  Something went wrong
511
525
  subquestion: |
512
- % if interview_metadata.get("main_interview_key"):
526
+ <% MAIN_METADATA = all_variables(special='metadata') %>
527
+ % if "original_form" not in MAIN_METADATA and interview_metadata.get("main_interview_key"):
513
528
  <%
514
529
  MAIN_METADATA = interview_metadata[interview_metadata["main_interview_key"]]
515
530
  %>
516
- % elif len(interview_metadata) > 1:
531
+ % elif "original_form" not in MAIN_METADATA and len(interview_metadata) > 1:
517
532
  <%
518
533
  del(interview_metadata["main_interview_key"]) # DADict creates the key on lookup above
519
534
  MAIN_METADATA = next(iter(interview_metadata.values()))
520
535
  %>
521
- % else:
522
- <% MAIN_METADATA = all_variables(special='metadata') %>
523
536
  % endif
524
537
  <% ORIGINAL_FORMS = MAIN_METADATA.get("original_form", []) if isinstance(MAIN_METADATA.get("original_form"), list) else ([MAIN_METADATA.get("original_form", "")] if MAIN_METADATA.get("original_form") else []) %>
525
538
 
@@ -92,6 +92,7 @@ comment: |
92
92
  ---
93
93
  include:
94
94
  - docassemble.ALToolbox:display_template.yml
95
+ - docassemble.ALToolbox:translation_strings.yml
95
96
  ---
96
97
  # clear playground errors
97
98
  objects:
@@ -186,9 +187,9 @@ default screen parts:
186
187
  <span class="title-container">
187
188
  <span class="al-logo">
188
189
  % if LOGO_IMAGE_URL:
189
- <img src="${ LOGO_IMAGE_URL }" alt="${ LOGO_IMAGE_ALT }"/>
190
+ <img src="${ LOGO_IMAGE_URL }" alt="${ LOGO_IMAGE_ALT or '' }"/>
190
191
  % else:
191
- <img src="${ al_logo.url_for() }" alt="${ al_logo.alt_text }"/>
192
+ <img src="${ al_logo.url_for() }" alt="${ al_logo.alt_text or '' }"/>
192
193
  % endif
193
194
  </span>
194
195
  <span class="al-title">
@@ -212,9 +213,9 @@ default screen parts:
212
213
  <span class="title-container">
213
214
  <span class="al-logo">
214
215
  % if LOGO_IMAGE_URL:
215
- <img src="${ LOGO_IMAGE_URL }" alt="${ LOGO_IMAGE_ALT }"/>
216
+ <img src="${ LOGO_IMAGE_URL }" alt="${ LOGO_IMAGE_ALT or '' }"/>
216
217
  % else:
217
- <img src="${ al_logo.url_for() }" alt="${ al_logo.alt_text }"/>
218
+ <img src="${ al_logo.url_for() }" alt="${ al_logo.alt_text or '' }"/>
218
219
  % endif
219
220
  </span>
220
221
  <span class="al-title">
@@ -455,7 +456,7 @@ code: |
455
456
  LOGO_IMAGE_URL = config_with_language_fallback("logo image url")
456
457
  ---
457
458
  code: |
458
- LOGO_IMAGE_ALT = config_with_language_fallback("logo alt")
459
+ LOGO_IMAGE_ALT = config_with_language_fallback("logo alt") or ""
459
460
  ---
460
461
  code: |
461
462
  NEW_FORM_LABEL = config_with_language_fallback("new form label")
@@ -1773,7 +1773,7 @@ content: |
1773
1773
  --------------|-----------
1774
1774
  Date of email | ${current_datetime().format_datetime()}
1775
1775
  Pages | ${al_num_package_pages }
1776
- Preferred language | ${ user_preferred_language if user_needs_interpreter else 'English' }
1776
+ Preferred language | ${ user_preferred_language if showifdef('user_needs_interpreter') else 'English' }
1777
1777
  Mobile phone | ${showifdef('users[0].mobile_number')}
1778
1778
  Other phone | ${showifdef('users[0].phone_number')}
1779
1779
  Email | ${showifdef('users[0].email')}
@@ -0,0 +1,17 @@
1
+ ---
2
+ include:
3
+ - assembly_line.yml
4
+ ---
5
+ mandatory: True
6
+ code: |
7
+ al_sessions_additional_variables_to_filter = []
8
+ al_sessions_snapshot_label
9
+ al_sessions_save_session_snapshot
10
+ al_sessions_save_status
11
+ finish_screen
12
+ ---
13
+ id: finish screen
14
+ event: finish_screen
15
+ question: |
16
+ Done
17
+ ---
@@ -262,7 +262,7 @@ ar: {'%(username_or_email)s does not exist': '%(username_or_email)s غير مو
262
262
  Lebanon: لبنان, Lesotho: ليسوتو, Liberia: ليبيريا, Libya: ليبيا, License: رخصة,
263
263
  Liechtenstein: ليختنشتاين, Limited Permissions: أذونات محدودة, Link copied to clipboard.: تم
264
264
  نسخ الرابط إلى الحافظة., Linked folder: المجلد المرتبط, Links: الروابط, List of ISO-639-1 language codes: قائمة
265
- رموز لغة ISO-639-1, Listen: يستمع, Lithuania: ليتوانيا, Live chat: الدردشة المباشرة,
265
+ رموز لغة ISO-639-1, Listen: استمع, Lithuania: ليتوانيا, Live chat: الدردشة المباشرة,
266
266
  Live chat is available: الدردشة المباشرة متاحة, Loading . . .: تحميل . . ., 'Loading. Please wait . . . ': 'جاري
267
267
  التحميل. الرجاء الانتظار. ', Log: سجل, Logs: السجلات, Luxembourg: لوكسمبورغ, Macao: ماكاو,
268
268
  Madagascar: مدغشقر, Malawi: ملاوي, Malaysia: ماليزيا, Maldives: جزر المالديف, Mali: مالي,
@@ -393,8 +393,8 @@ ar: {'%(username_or_email)s does not exist': '%(username_or_email)s غير مو
393
393
  كل مثيل لـ Null بترجمة مقتبسة., Request Developer Account: طلب حساب المطور, Resend Confirmation Email: إعادة
394
394
  إرسال رسالة التأكيد, Resend email confirmation email: إعادة إرسال رسالة تأكيد
395
395
  البريد الإلكتروني, Reset Password: إعادة تعيين كلمة المرور, Reset e-mail confirmation: إعادة
396
- تعيين تأكيد البريد الإلكتروني, Reset password: إعادة تعيين كلمة المرور, Restart: إعادة
397
- تشغيل, Restarting: إعادة التشغيل, Resume: استئناف, Resume an interview: استئناف
396
+ تعيين تأكيد البريد الإلكتروني, Reset password: إعادة تعيين كلمة المرور, Restart: أعد
397
+ التشغيل, Restarting: إعادة التشغيل, Resume: استئناف, Resume an interview: استئناف
398
398
  المقابلة, Retry: إعادة المحاولة, Return: يعود, Retype New Password: أعد كتابة
399
399
  كلمة المرور الجديدة, Retype Password: أعد كتابة كلمة المرور, Role: دور, Romania: رومانيا,
400
400
  Room: غرفة, Run: يجري, Running in other tab.: تشغيل في علامة تبويب أخرى., Russian Federation: الاتحاد
@@ -409,6 +409,12 @@ ar: {'%(username_or_email)s does not exist': '%(username_or_email)s غير مو
409
409
  التغييرات التي أجريتها على معلومات الحزمة, Saved: أنقذ, Saved at: تم الحفظ في,
410
410
  Scan: مسح ضوئي, Scan the barcode with your phone's authenticator app and enter the verification code.: قم
411
411
  بمسح الرمز الشريطي باستخدام تطبيق المصادقة الخاص بهاتفك وأدخل رمز التحقق., Score: نتيجة,
412
+ "Change country, selected ${countryName} (${dialCode})": "تغيير البلد، المحدد حاليًا ${countryName} (${dialCode})",
413
+ "Select country": "حدد البلد", "List of countries": "قائمة الدول", "Clear search": "مسح البحث",
414
+ "No results found": "لم يتم العثور على نتائج", "1 result found": "تم العثور على نتيجة واحدة",
415
+ "${count} results found": "تم العثور على ${count} نتيجة",
416
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'يبدو أن رقم الهاتف هذا غير صحيح. لاحظ أن الرقم غير الأمريكي يحتاج إلى "+" قبل الرقم.',
417
+ "You have entered %d character.": "لقد أدخلت %d حرفًا.", "You have entered %d characters.": "لقد أدخلت %d أحرف.",
412
418
  Search: يبحث, Second Subdivision: القسم الفرعي الثاني, Second factor authentication: المصادقة
413
419
  بالعامل الثاني, Second subdivision: القسم الفرعي الثاني, Section: قسم, Sections: الأقسام,
414
420
  Security Method: طريقة الأمان, Select a package: اختر الباقة, Select a value between: حدد
@@ -750,4 +756,5 @@ ar: {'%(username_or_email)s does not exist': '%(username_or_email)s غير مو
750
756
  them: هم, themself: أنفسهم, themselves: أنفسهم, they: هم, to proceed.: للمتابعة.,
751
757
  'true': حقيقي, unavailable: غير متاح, us: نحن, v.: فعل, was saved at: تم حفظه في,
752
758
  we: نحن, x: س, y: ي, year: سنة, yes: نعم, you: أنت, yourself: نفسك, yourselves: أنفسكم,
759
+ Pause: إيقاف مؤقت, Stop: إيقاف,
753
760
  Åland Islands: جزر آلاند, Month: شهر, Day: يوم, Year: سنة}
@@ -299,7 +299,7 @@ es: {'%(username_or_email)s does not exist': '%(username_or_email)s no existe',
299
299
  Libya: Libia, License: Licencia, Liechtenstein: Liechtenstein, Limited Permissions: Permisos
300
300
  limitados, Link copied to clipboard.: Enlace copiado al portapapeles., Linked folder: Carpeta
301
301
  vinculada, Links: Campo de golf, List of ISO-639-1 language codes: Lista de códigos
302
- de idioma ISO-639-1, Listen: Escucha, Lithuania: Lituania, Live chat: Chat en
302
+ de idioma ISO-639-1, Listen: Escuchar, Lithuania: Lituania, Live chat: Chat en
303
303
  vivo, Live chat is available: Chat en vivo está disponible, Loading . . .: Cargando
304
304
  . . ., 'Loading. Please wait . . . ': Cargando. Por favor espera . . ., Log: Registro,
305
305
  Logs: Troncos, Luxembourg: Luxemburgo, Macao: Macao, Madagascar: Madagascar, Malawi: Malawi,
@@ -464,7 +464,14 @@ es: {'%(username_or_email)s does not exist': '%(username_or_email)s no existe',
464
464
  Save your changes to the package information: Guarda los cambios en la información
465
465
  del paquete., Saved: Guardado, Saved at: Guardado en, Scan: Escanear, Scan the barcode with your phone's authenticator app and enter the verification code.: Escanee
466
466
  el código de barras con la aplicación de autenticación de su teléfono e ingrese
467
- el código de verificación., Score: Puntaje, Search: Buscar, Second Subdivision: Segunda
467
+ el código de verificación., Score: Puntaje,
468
+ "Change country, selected ${countryName} (${dialCode})": "Cambiar país, seleccionado ${countryName} (${dialCode})",
469
+ "Select country": "Seleccionar país", "List of countries": "Lista de países", "Clear search": "Borrar búsqueda",
470
+ "No results found": "No se han encontrado resultados", "1 result found": "1 resultado encontrado",
471
+ "${count} results found": "Se encontraron ${count} resultados",
472
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'Este número de teléfono no parece correcto. Tenga en cuenta que un número que no es de EE. UU. necesita un "+" antes del número.',
473
+ "You have entered %d character.": "Ha escrito %d carácter.", "You have entered %d characters.": "Ha escrito %d caracteres.",
474
+ Search: Buscar, Second Subdivision: Segunda
468
475
  subdivisión, Second factor authentication: Autenticación de segundo factor, Second subdivision: Segunda
469
476
  subdivisión, Section: Sección, Sections: Secciones, Security Method: Método de
470
477
  seguridad, Select a package: Seleccione un paquete, Select a value between: Seleccione
@@ -860,4 +867,5 @@ es: {'%(username_or_email)s does not exist': '%(username_or_email)s no existe',
860
867
  t: t, them: ellos, themself: ellos mismos, themselves: ellos mismos, they: ellos,
861
868
  to proceed.: para proceder., 'true': cierto, unavailable: indisponible, us: a nosotros,
862
869
  v.: v., was saved at: fue guardado en, we: nosotros, x: X, y: y, year: año, yes: sí,
863
- you: tú, yourself: tú mismo, yourselves: vosotros, Åland Islands: Islas Åland}
870
+ you: tú, yourself: tú mismo, yourselves: vosotros, Pause: Pausar, Stop: Detener,
871
+ Åland Islands: Islas Åland}
@@ -456,7 +456,7 @@ fr: {'%(username_or_email)s does not exist': '%(nom_utilisateur_ou_email)s n''ex
456
456
  un compte développeur, Resend Confirmation Email: Renvoyer l'e-mail de confirmation,
457
457
  Resend email confirmation email: Renvoyer l'e-mail de confirmation, Reset Password: Réinitialiser
458
458
  le mot de passe, Reset e-mail confirmation: Réinitialiser la confirmation par
459
- e-mail, Reset password: Réinitialiser le mot de passe, Restart: Redémarrage, Restarting: Redémarrage,
459
+ e-mail, Reset password: Réinitialiser le mot de passe, Restart: Recommencer, Restarting: Redémarrage,
460
460
  Resume: Reanudar, Resume an interview: Reprendre un entretien, Retry: Réessayer, Return: Retour,
461
461
  Retype New Password: Retapez le nouveau mot de passe, Retype Password: Retaper le
462
462
  mot de passe, Role: Rôle, Romania: Roumanie, Room: Chambre, Run: Courir, Running in other tab.: Exécution
@@ -471,7 +471,14 @@ fr: {'%(username_or_email)s does not exist': '%(nom_utilisateur_ou_email)s n''ex
471
471
  vos modifications apportées aux informations du colis, Saved: Enregistré, Saved at: Enregistré
472
472
  à, Scan: Balayage, Scan the barcode with your phone's authenticator app and enter the verification code.: Scannez
473
473
  le code-barres avec l'application d'authentification de votre téléphone et saisissez
474
- le code de vérification., Score: Score, Search: Recherche, Second Subdivision: Deuxième
474
+ le code de vérification., Score: Score,
475
+ "Change country, selected ${countryName} (${dialCode})": "Changer de pays, ${countryName} sélectionné (${dialCode})",
476
+ "Select country": "Sélectionner un pays", "List of countries": "Liste des pays", "Clear search": "Effacer la recherche",
477
+ "No results found": "Aucun résultat trouvé", "1 result found": "1 résultat trouvé",
478
+ "${count} results found": "${count} résultats trouvés",
479
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'Ce numéro de téléphone ne semble pas correct. Notez qu’un numéro non américain doit être précédé d’un "+".',
480
+ "You have entered %d character.": "Vous avez saisi %d caractère.", "You have entered %d characters.": "Vous avez saisi %d caractères.",
481
+ Search: Recherche, Second Subdivision: Deuxième
475
482
  subdivision, Second factor authentication: Authentification à deux facteurs, Second subdivision: Deuxième
476
483
  subdivision, Section: Section, Sections: Sections, Security Method: Méthode de
477
484
  sécurité, Select a package: Sélectionnez un forfait, Select a value between: Sélectionnez
@@ -875,4 +882,4 @@ fr: {'%(username_or_email)s does not exist': '%(nom_utilisateur_ou_email)s n''ex
875
882
  themself: eux-mêmes, themselves: eux-mêmes, they: ils, to proceed.: pour continuer.,
876
883
  'true': vrai, unavailable: indisponible, us: nous, v.: v., was saved at: a été sauvé
877
884
  à, we: nous, x: x, y: et, year: année, yes: Oui, you: toi, yourself: toi-même,
878
- yourselves: vous-mêmes, Åland Islands: Îles Åland}
885
+ yourselves: vous-mêmes, Pause: Pause, Stop: Arrêter, Åland Islands: Îles Åland}
@@ -0,0 +1,16 @@
1
+ ht:
2
+ "Change country, selected ${countryName} (${dialCode})": "Chanje peyi, peyi chwazi ${countryName} (${dialCode})"
3
+ "Select country": "Chwazi peyi"
4
+ "List of countries": "Lis peyi yo"
5
+ "Search": "Rechèch"
6
+ "Clear search": "Efase rechèch"
7
+ "No results found": "Pa jwenn okenn rezilta"
8
+ "1 result found": "Yo jwenn 1 rezilta"
9
+ "${count} results found": "Yo jwenn ${count} rezilta"
10
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'Nimewo telefòn sa a pa sanble kòrèk. Tanpri sonje yon nimewo ki pa ameriken bezwen yon "+" anvan nimewo a.'
11
+ "You have entered %d character.": "Ou antre %d karaktè."
12
+ "You have entered %d characters.": "Ou antre %d karaktè."
13
+ "Listen": "Koute"
14
+ "Restart": "Rekòmanse"
15
+ "Pause": "Pòz"
16
+ "Stop": "Sispann"
@@ -0,0 +1,16 @@
1
+ km:
2
+ "Change country, selected ${countryName} (${dialCode})": "ប្តូរប្រទេស ប្រទេសដែលបានជ្រើសរើស ${countryName} (${dialCode})"
3
+ "Select country": "ជ្រើសរើសប្រទេស"
4
+ "List of countries": "បញ្ជីប្រទេស"
5
+ "Search": "ស្វែងរក"
6
+ "Clear search": "សម្អាតការស្វែងរក"
7
+ "No results found": "រកមិនឃើញលទ្ធផល"
8
+ "1 result found": "រកឃើញលទ្ធផល ១"
9
+ "${count} results found": "រកឃើញលទ្ធផល ${count}"
10
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'លេខទូរសព្ទនេះមើលទៅមិនត្រឹមត្រូវទេ។ សូមចំណាំថា លេខទូរសព្ទដែលមិនមែនជាលេខអាមេរិក ត្រូវដាក់សញ្ញា "+" នៅពីមុខលេខ។'
11
+ "You have entered %d character.": "អ្នកបានបញ្ចូល %d តួអក្សរ។"
12
+ "You have entered %d characters.": "អ្នកបានបញ្ចូល %d តួអក្សរ។"
13
+ "Listen": "ស្តាប់"
14
+ "Restart": "ចាប់ផ្តើមឡើងវិញ"
15
+ "Pause": "ផ្អាក"
16
+ "Stop": "បញ្ឈប់"
@@ -60,6 +60,13 @@ zh-Hans:
60
60
  zh-Hant:
61
61
  name: Chinese (Traditional)
62
62
  native_name: 繁體中文
63
+ # Alternative codes for Chinese
64
+ zh-CN:
65
+ name: Chinese (Simplified, China)
66
+ native_name: 中文(中国)
67
+ zh-TW:
68
+ name: Chinese (Traditional, Taiwan, Hong Kong, Macau)
69
+ native_name: 中文(台湾)
63
70
  # If you have a choice, prefer the more specific Chinese (Simplified) or Chinese (Traditional) codes
64
71
  # Note: because we target scripts, we omit Mandarin/Cantonese distinctions in this file.
65
72
  zh:
@@ -145,4 +152,4 @@ kn:
145
152
  native_name: ಕನ್ನಡ
146
153
  ml:
147
154
  name: Malayalam
148
- native_name: മലയാളം
155
+ native_name: മലയാളം
@@ -453,7 +453,14 @@ Resume: जारी राख्नुहोस्, Resume an interview: अन
453
453
  जानकारीमा आफ्ना परिवर्तनहरू बचत गर्नुहोस्।, Saved: सुरक्षित गरियो, Saved at: 'बचत
454
454
  गरिएको समय:', Scan: स्क्यान गर्नुहोस्, Scan the barcode with your phone's authenticator app and enter the verification code.: आफ्नो
455
455
  फोनको प्रमाणक एप प्रयोग गरी बारकोड स्क्यान गर्नुहोस् र प्रमाणिकरण कोड प्रविष्ट
456
- गर्नुहोस्।, Score: स्कोर, Search: खोज्नुहोस्, Second Subdivision: दोस्रो उपविभाजन,
456
+ गर्नुहोस्।, Score: स्कोर,
457
+ "Change country, selected ${countryName} (${dialCode})": "देश परिवर्तन गर्नुहोस्, हाल चयन गरिएको ${countryName} (${dialCode})",
458
+ "Select country": "देश चयन गर्नुहोस्", "List of countries": "देशहरूको सूची", "Clear search": "खोजी खाली गर्नुहोस्",
459
+ "No results found": "कुनै परिणाम फेला परेन", "1 result found": "१ परिणाम फेला पर्यो",
460
+ "${count} results found": "${count} वटा परिणाम फेला परे",
461
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'यो फोन नम्बर सही जस्तो देखिँदैन। अमेरिकाबाहिरको नम्बरअघि "+" राख्नुपर्छ भन्ने कुरा ध्यान दिनुहोस्।',
462
+ "You have entered %d character.": "तपाईंले %d अक्षर प्रविष्ट गर्नुभएको छ।", "You have entered %d characters.": "तपाईंले %d अक्षरहरू प्रविष्ट गर्नुभएको छ।",
463
+ Search: खोज्नुहोस्, Second Subdivision: दोस्रो उपविभाजन,
457
464
  Second factor authentication: दोस्रो कारक प्रमाणीकरण, Second subdivision: दोस्रो
458
465
  उपविभाजन, Section: खण्ड, Sections: खण्डहरू, Security Method: सुरक्षा विधि, Select a package: प्याकेज
459
466
  चयन गर्नुहोस्, Select a value between: बीचमा मान चयन गर्नुहोस्, Select file: फाइल
@@ -837,5 +844,6 @@ Resume: जारी राख्नुहोस्, Resume an interview: अन
837
844
  skip: छोड्नुहोस्, something: केहि, system: प्रणाली, t: ट, them: तिनीहरूलाई, themself: आफैं,
838
845
  themselves: आफैं, they: तिनीहरू, to proceed.: अगाडि बढ्न।, 'true': सत्य, unavailable: उपलब्ध
839
846
  छैन, us: हामीलाई, v.: वि., was saved at: मा सुरक्षित गरिएको थियो, we: हामी, x: x,
840
- y: र, year: वर्ष, yes: हो, you: तिमी, yourself: आफैँ, yourselves: आफैं, Åland Islands: अलान्ड
847
+ y: र, year: वर्ष, yes: हो, you: तिमी, yourself: आफैँ, yourselves: आफैं, Pause: पज गर्नुहोस्,
848
+ Stop: रोक्नुहोस्, Åland Islands: अलान्ड
841
849
  टापुहरू}
@@ -0,0 +1,16 @@
1
+ pt:
2
+ "Change country, selected ${countryName} (${dialCode})": "Alterar país, país selecionado ${countryName} (${dialCode})"
3
+ "Select country": "Selecionar país"
4
+ "List of countries": "Lista de países"
5
+ "Search": "Procurar"
6
+ "Clear search": "Limpar pesquisa"
7
+ "No results found": "Nenhum resultado encontrado"
8
+ "1 result found": "1 resultado encontrado"
9
+ "${count} results found": "${count} resultados encontrados"
10
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'Este número de telefone não parece correto. Observe que um número que não seja dos EUA precisa de um "+" antes do número.'
11
+ "You have entered %d character.": "Você digitou %d caractere."
12
+ "You have entered %d characters.": "Você digitou %d caracteres."
13
+ "Listen": "Ouvir"
14
+ "Restart": "Reiniciar"
15
+ "Pause": "Pausar"
16
+ "Stop": "Parar"
@@ -0,0 +1,10 @@
1
+ @snapshots
2
+ Feature: Test saving snapshots
3
+
4
+ Scenario: User can save an answer snapshot
5
+ Given I log in with "DA_ADMIN_EMAIL" and "DA_ADMIN_PASSWORD"
6
+ And I start the interview at "test_saving_snapshots"
7
+ And I should see the phrase "Save an answer set"
8
+ And I set the var "al_sessions_snapshot_label" to "My test snapshot"
9
+ And I tap to continue
10
+ And I should see the phrase "Your answer set was successfully saved"
@@ -0,0 +1,16 @@
1
+ vi:
2
+ "Change country, selected ${countryName} (${dialCode})": "Đổi quốc gia, quốc gia đã chọn ${countryName} (${dialCode})"
3
+ "Select country": "Chọn quốc gia"
4
+ "List of countries": "Danh sách các quốc gia"
5
+ "Search": "Tìm kiếm"
6
+ "Clear search": "Xóa tìm kiếm"
7
+ "No results found": "Không tìm thấy kết quả nào"
8
+ "1 result found": "Đã tìm thấy 1 kết quả"
9
+ "${count} results found": "Đã tìm thấy ${count} kết quả"
10
+ 'This phone number doesn''t look right. Note that a non-US number needs a "+" before the number.': 'Số điện thoại này có vẻ không đúng. Lưu ý rằng số điện thoại không phải của Hoa Kỳ cần có dấu "+" trước số.'
11
+ "You have entered %d character.": "Bạn đã nhập %d ký tự."
12
+ "You have entered %d characters.": "Bạn đã nhập %d ký tự."
13
+ "Listen": "Nghe"
14
+ "Restart": "Khởi động lại"
15
+ "Pause": "Tạm dừng"
16
+ "Stop": "Dừng"