diff --git a/.eleventy.js b/.eleventy.js index cc9294b66..adcd6ed61 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -104,6 +104,17 @@ module.exports = function (eleventyConfig) { return content; }); + // Add UTF-8 BOM to CSV files for proper Excel encoding + eleventyConfig.addTransform("csvUtf8Bom", function (content, outputPath) { + if (outputPath && outputPath.endsWith(".csv")) { + // For Excel compatibility, we need to ensure the content is properly encoded + // Try a different approach with UTF-8 BOM and ensure content is UTF-8 + const utf8Bom = '\uFEFF'; // Use Unicode BOM character instead of bytes + return utf8Bom + content; + } + return content; + }); + eleventyConfig.addFilter("localeMatch", function (collection) { const { locale } = this.ctx; // avoid retrieving it for each item return collection.filter((item) => item.data.locale === locale); @@ -195,11 +206,65 @@ module.exports = function (eleventyConfig) { return changedPages; // Returning the changed URLs, titles, and locales for the template }); + // Get the role keys that belong to a given group + eleventyConfig.addFilter("roleKeysForGroup", function (groupKey, rolesData) { + if (!groupKey || !rolesData || !rolesData.roles) return []; + return Object.entries(rolesData.roles) + .filter(([, meta]) => meta.group === groupKey) + .map(([key]) => key); + }); + + // Given a list of role keys, return all pages that match ANY of them + eleventyConfig.addFilter("byAnyRole", function (collection, roleKeys) { + if (!collection || !roleKeys || !roleKeys.length) return []; + return collection.filter((item) => { + const r = item.data.role; + if (!r) return false; + const arr = Array.isArray(r) ? r : [r]; + return arr.some((k) => roleKeys.includes(k)); + }); + }); + + // Collection of all pages that have at least one role + eleventyConfig.addCollection("rolePages", (api) => + api.getAll().filter((item) => !!item.data.role) + ); + + // Custom collection for role groups to work around pagination tag issues + eleventyConfig.addCollection("roleGroup", (api) => { + // Find all pages generated from the roles-group.njk template OR + // pages with URLs matching role group patterns + return api.getAll().filter((item) => { + // Check if the page was generated from the roles-group template + const fromRoleGroupTemplate = item.inputPath && item.inputPath.includes('roles-group.njk'); + + // Check if URL matches role group pattern (e.g., /en/roles/business/, /fr/roles/design/) + const matchesRoleGroupPattern = item.url && item.url.match(/^\/(en|fr)\/roles\/(administration|author|business|design|development|testing)\/$/); + + return fromRoleGroupTemplate || matchesRoleGroupPattern; + }); + }); + // Add custom Markdown filter for Nunjucks eleventyConfig.addNunjucksFilter("markdown", function (value) { return md.render(value); }); + // Add split filter for Nunjucks + eleventyConfig.addNunjucksFilter("split", function (str, separator) { + if (typeof str !== 'string') return []; + return str.split(separator || ' '); + }); + + // Add wordCount filter for convenience + eleventyConfig.addNunjucksFilter("wordCount", function (content) { + if (!content) return 0; + const text = typeof content === 'string' ? content : String(content); + const stripped = stripHtml(text).result; + const words = stripped.trim().split(/\s+/); + return words.length === 1 && words[0] === '' ? 0 : words.length; + }); + let changedFilesMap = new Map(); let changedFilePaths = new Set(); let gitChangedUrls = []; @@ -331,6 +396,26 @@ module.exports = function (eleventyConfig) { gitChangedUrls = []; }); + // Add computed data for git creation dates + eleventyConfig.addGlobalData("eleventyComputed", { + gitCreated: (data) => { + if (data.page && data.page.inputPath) { + try { + const gitCommand = `git log --format="%ai" --reverse "${data.page.inputPath}" | head -1`; + const result = execSync(gitCommand, { encoding: 'utf8' }).trim(); + + if (result) { + return new Date(result); + } + } catch (error) { + // Silently handle errors - some files might not have git history + // console.error(`Error getting git creation date for ${data.page.inputPath}:`, error.message); + } + } + return null; + } + }); + return { dir: { input: "src", diff --git a/src/_data/alerts.js b/src/_data/alerts.js index 8170de084..e59448c71 100644 --- a/src/_data/alerts.js +++ b/src/_data/alerts.js @@ -21,6 +21,11 @@ module.exports = { "Les liens qui ne fonctionnent que derrière le pare-feu du gouvernement du Canada sont marqués avec ", icon: "icône ", hiddenTextLink: "lien interne", + + // Role content coming soon alert, appears on role pages when no content is tagged with that role + roleContentComingSoon: "Bientôt disponible !", + roleContentComingSoonText: "Actuellement, aucun contenu n'a été assigné à ce rôle. Une fois que le contenu sera étiqueté avec ce rôle, il sera listé sur cette page.", + roleContentComingSoonTextGroup: "Actuellement, aucun contenu n'a été assigné à ce rôle. Une fois que le contenu sera étiqueté avec ce rôle, il sera listé ici.", }, en: { @@ -43,5 +48,10 @@ module.exports = { "Links that only work within the Government of Canada firewall are marked with ", icon: "icon ", hiddenTextLink: "internal link", + + // Role content coming soon alert, appears on role pages when no content is tagged with that role + roleContentComingSoon: "Coming soon!", + roleContentComingSoonText: "Currently no content has been assigned to this role. Once content is tagged with this role, it will be listed on this page.", + roleContentComingSoonTextGroup: "Currently no content has been assigned to this role. Once content is tagged with this role, it will be listed here.", }, }; diff --git a/src/_data/groupPairsEn.js b/src/_data/groupPairsEn.js new file mode 100644 index 000000000..ca5c7fb24 --- /dev/null +++ b/src/_data/groupPairsEn.js @@ -0,0 +1,19 @@ +module.exports = () => { + const roles = require("./roles.js"); + return Object.entries(roles.groups.en).map(([key, name]) => { + // Get all role keys that belong to this group + const roleKeysInGroup = Object.entries(roles.roles) + .filter(([, meta]) => meta.group === key) + .map(([roleKey]) => roleKey); + + // Get the translated labels for these roles + const roleLabels = roleKeysInGroup.map(roleKey => roles.labels.en[roleKey]); + + return [ + key, + name, + roles.descriptions.en[key], + roleLabels + ]; + }).sort(); +}; diff --git a/src/_data/groupPairsFr.js b/src/_data/groupPairsFr.js new file mode 100644 index 000000000..17a18804a --- /dev/null +++ b/src/_data/groupPairsFr.js @@ -0,0 +1,19 @@ +module.exports = () => { + const roles = require("./roles.js"); + return Object.entries(roles.groups.fr).map(([key, name]) => { + // Get all role keys that belong to this group + const roleKeysInGroup = Object.entries(roles.roles) + .filter(([, meta]) => meta.group === key) + .map(([roleKey]) => roleKey); + + // Get the translated labels for these roles + const roleLabels = roleKeysInGroup.map(roleKey => roles.labels.fr[roleKey]); + + return [ + key, + name, + roles.descriptions.fr[key], + roleLabels + ]; + }).sort(); +}; diff --git a/src/_data/rolePairs.js b/src/_data/rolePairs.js new file mode 100644 index 000000000..fcfc247ca --- /dev/null +++ b/src/_data/rolePairs.js @@ -0,0 +1,6 @@ +// Build an array of [roleKey, roleMeta] tuples from roles.roles +module.exports = () => { + const rolesData = require("./roles.js"); // same folder as this file + // rolesData.roles is an object like { contentAuthoring: { group: "author" }, ... } + return Object.entries(rolesData.roles).sort(([a], [b]) => a.localeCompare(b)); +}; diff --git a/src/_data/roles.js b/src/_data/roles.js new file mode 100644 index 000000000..318e307da --- /dev/null +++ b/src/_data/roles.js @@ -0,0 +1,281 @@ +// _data/roles.js +module.exports = { + // canonical keys you'll reference in front matter + roles: { + businessAnalysis: { group: "business" }, + contentAuthoring: { group: "author" }, + contentPublishing: { group: "author" }, + uxResearch: { group: "design" }, + uxDesign: { group: "design" }, + visualDesign: { group: "design" }, + frontEndDev: { group: "development" }, + backEndDev: { group: "development" }, + qaAutomated: { group: "testing" }, + qaManual: { group: "testing" }, + productOwnership: { group: "administration" }, + projectManagement: { group: "administration" }, + governance: { group: "administration" }, + }, + + // translated labels for roles + labels: { + en: { + businessAnalysis: "Business analysis", + contentAuthoring: "Content authoring", + contentPublishing: "Content publishing", + uxResearch: "User experience (UX) research", + uxDesign: "User experience (UX) design", + visualDesign: "Visual design", + frontEndDev: "Front-end development", + backEndDev: "Back-end development", + qaAutomated: "Automated Quality Assurance (QA) testing", + qaManual: "Manual Quality Assurance (QA) testing", + productOwnership: "Product ownership", + projectManagement: "Project management", + governance: "Governance", + }, + fr: { + businessAnalysis: "Analyse d'affaires", + contentAuthoring: "Rédaction de contenu", + contentPublishing: "Publication de contenu", + uxResearch: "Recherche d'expérience utilisateur (EU)", + uxDesign: "Conception d'expérience utilisateur (EU)", + visualDesign: "Conception visuelle", + frontEndDev: "Développement front-end", + backEndDev: "Développement back-end", + qaAutomated: "Tests d'assurance qualité (AQ) automatisés", + qaManual: "Tests d'assurance qualité (AQ) manuels", + productOwnership: "Responsabilité du produit", + projectManagement: "Gestion de projet", + governance: "Gouvernance", + }, + }, + + // translated labels for groups + groups: { + en: { + business: "Business role group", + author: "Author role group", + design: "Design role group", + development: "Development role group", + testing: "Testing role group", + administration: "Administration role group", + }, + fr: { + business: "Groupe des rôles d'affaires", + author: "Groupe des rôles d'auteurs", + design: "Groupe des rôles de conception", + development: "Groupe des rôles de développement", + testing: "Groupe des rôles de test", + administration: "Groupe des rôles administratifs", + }, + }, + + // ARRM role descriptions from W3C WAI + arrm: { + en: { + businessAnalysis: { + title: "Business Analysis", + description: "Business analysts are involved in the design or modification of business systems or IT systems. They interact with business stakeholders and subject matter experts in order to understand their problems and needs. They gather, document and analyze business needs and requirements to help steer the team towards an end result that meets the organization's needs and expectations.", + jobTitles: ["Business Analyst", "Client Sponsor"], + groupDescription: "Writes business requirements and/or initial user stories, are concerned with ensuring that the project delivers the agreed-upon business benefits." + }, + contentAuthoring: { + title: "Content Authoring", + description: "Content creation is often used in marketing, but can also be a task assigned to a role within a product team. Content creation involves defining a content strategy, the writing or creation of the content or media for a product. The person who authors the content is responsible for making sure that content is accessible to people with disabilities. Content creation extends to roles specific audio and video media production. These begin with the writing of scripts but can extend to the production of the media files or support of live streaming content.", + keyDeliverables: ["Body copy", "managed content", "scripts", "taxonomies", "writing guidelines", "media files including PDF, audio and video"], + tasks: ["Content authoring", "media and documentation creation", "content strategies definition"], + jobTitles: ["Content Strategist", "Content Creator", "Content Designer", "Content Author", "Digital Copywriter", "UX Writer", "Content Producer", "Technical Writer", "Script Writer", "Video Producer", "Podcast Host"], + groupDescription: "This role includes content strategy and content authoring, including audio/video production. Responsible for creating all text presented by the deliverable in all forms (HTML, audio, video). Defines or selects the standards the content should meet and processes for its review and preparation." + }, + contentPublishing: { + title: "Content Publishing", + description: "Team members who are not front-end web developers that are tasked with preparing content for publishing to websites, products, applications, etc. These team members do not author content, instead they work with the content within specific business enterprise systems or software tools and apply edits to material generated by content authors. Content Publishers may perform some tasks that are a part of the front end web developer skillset, however they are not web developers and are often applying this markup using proprietary tools and widget.", + keyDeliverables: ["Content editing and formatting", "metadata and SEO optimization", "content publishing schedule", "cross-platform compatibility", "quality assurance and testing"], + tasks: ["Advanced tagging in a PDF document", "adjusting timing of captions", "creating and editing transcripts", "conversion to ePUB documentation", "applying tags though a proprietary software to generate heading structure", "SSML"], + jobTitles: ["Content Strategist", "Content Producer", "Content Publisher", "Publishing Technology Specialist", "Content Designer", "Video Editor", "Accessible Materials Specialist", "Information Developer", "Content Developer", "Publishing Implementation Manager"], + groupDescription: "This role includes content strategy and content authoring, including audio/video production. Responsible for creating all text presented by the deliverable in all forms (HTML, audio, video). Defines or selects the standards the content should meet and processes for its review and preparation." + }, + uxResearch: { + title: "User experience (UX) Researcher", + description: "UX Researchers conduct both exploratory and generative research with end users (e.g. user interviews, ethnographic research, etc.) to gather their feedback. The responsibility of this role is to continuously feed user feedback to those creating products. They test existing concepts and summarize user insights to inform the assets that will be built by the roles in UX Design, Visual Design, Front-end Development and Content Authoring.", + keyDeliverables: ["Findings from moderated and unmoderated versions of user research studies", "usability testing and user interviews (i.e. a moderator or facilitator was present during the test, or the end user was alone)"], + tasks: ["Conducting user research with a partial prototype", "concept", "or completed product"], + jobTitles: ["User Researcher", "UXR (User Experience Researcher)", "Usability Analyst"], + groupDescription: "This group includes user research, user experience (UX), and presentation decisions. Some roles within this group define the user experience of a product, designing its behaviors and interactions with the end user and/or their assistive technologies. Some roles provide the general \"look and feel\" of the products and features, covering presentation, fonts and colors. Others outline the functionality of features, and their operation through assistive technologies (ATs). They translate input from business roles into user stories, requirements, specifications, documentation, and guidelines used by other roles (mainly Development) to build the finished product. This includes applying user research that has been conducted and an understanding of the intended audiences for a quality experience." + }, + uxDesign: { + title: "User experience (UX) Design", + description: "UX Designers can potentially cover numerous related areas, from conceptualizing the user journey to partial front-end development. For the purposes of this resource, UX Design is defined by its core responsibilities, such as information architecture, creating wireframes (low fidelity screen mockups), and creating prototypes that define interactions.", + keyDeliverables: ["User journeys", "wireframes", "prototypes", "interaction guidelines", "information architecture"], + tasks: ["User workflow / process maps", "designing user experiences", "user task and workflow mapping", "creating and maintaining user personas"], + jobTitles: ["User Experience (UX) Designer", "Product Designer", "Web Designer", "Service Designer"], + groupDescription: "This group includes user research, user experience (UX), and presentation decisions. Some roles within this group define the user experience of a product, designing its behaviors and interactions with the end user and/or their assistive technologies. Some roles provide the general \"look and feel\" of the products and features, covering presentation, fonts and colors. Others outline the functionality of features, and their operation through assistive technologies (ATs). They translate input from business roles into user stories, requirements, specifications, documentation, and guidelines used by other roles (mainly Development) to build the finished product. This includes applying user research that has been conducted and an understanding of the intended audiences for a quality experience." + }, + visualDesign: { + title: "Visual Design", + description: "Visual Designers focus largely on the look and feel of an product, as an end user would experience it, visually or otherwise. This includes specifying original design of interface elements and layout, choosing fonts and colors, and more. While UX design is focused on how something works, visual design is focused on how it looks and feels.", + keyDeliverables: ["Style guides", "page comps", "design mockups", "image files"], + tasks: ["Visual styling", "logos and branding", "animation", "and iconography design"], + jobTitles: ["Visual Designer", "User Interface (UI) Designer", "Interaction Designer", "Graphic Designer"], + groupDescription: "This group includes user research, user experience (UX), and presentation decisions. Some roles within this group define the user experience of a product, designing its behaviors and interactions with the end user and/or their assistive technologies. Some roles provide the general \"look and feel\" of the products and features, covering presentation, fonts and colors. Others outline the functionality of features, and their operation through assistive technologies (ATs). They translate input from business roles into user stories, requirements, specifications, documentation, and guidelines used by other roles (mainly Development) to build the finished product. This includes applying user research that has been conducted and an understanding of the intended audiences for a quality experience." + }, + frontEndDev: { + title: "Front-End Development", + description: "Front-end development typically builds the parts of a product that will be interacted with by the user - specifically, the user interface. For the purpose of this resource, front-end development refers to the implementation or codification of the design in functional templates for a product using technologies such as HTML, CSS and JavaScript.", + keyDeliverables: ["HTML and CSS files", "client-side scripting", "JavaScript libraries and frameworks"], + tasks: ["Pattern libraries and prototypes", "template functionalities", "semantically-rich HTML document structures and widgets", "use and adapt frameworks and content management systems"], + jobTitles: ["Front-End Developer", "Web Developer", "Full-Stack Developer", "UI/UX Developer", "JavaScript Developer", "UI/UX Engineer"], + groupDescription: "Oversees the creation, coding and delivery of the product based upon the requirements provided. Responsible for all user-facing and supporting systems, along with all related infrastructure selection, setup and deployment." + }, + backEndDev: { + title: "Back-End Development", + description: "Back-end developers have a smaller, more indirect involvement with accessibility work, but still play a critical role in delivering accessible products, as the underlying product architecture can inform accessibility solutions. It's important for back-end developers to be involved in accessibility discussions so that any potential issues stemming from how the database is organized can be caught and fixed, or better yet, avoided altogether.", + jobTitles: ["Back-End Developer", "Middleware Developer", "Database Architect", "Data Engineer"], + groupDescription: "Oversees the creation, coding and delivery of the product based upon the requirements provided. Responsible for all user-facing and supporting systems, along with all related infrastructure selection, setup and deployment." + }, + qaAutomated: { + title: "Automated Quality Assurance (QA) testing", + description: "Quality Assurance (QA) automation frameworks typically run against products in order to test features and functionality that would otherwise fall to a manual QA tester. For the purpose of this resource, a QA Tester performing automated tests is responsible for running tests within an automation framework that covers accessibility features and requirements. This can be accomplished either through automation of functional tests, and/or the inclusion of an accessibility testing library within the framework. QA Testers responsible for automated testing may also typically run automated accessibility testing tools, such as browser extensions or add-ons. It is expected that automated tools will uncover about 30 to 35% of potential accessibility issues on a screen. The rest will be identified through the team's manual accessibility testing methodology.", + jobTitles: ["QA Automation Engineer", "Quality Engineer", "Automation Engineer"], + groupDescription: "QA Testers run automated test frameworks or manually test products to confirm correct operation based upon provided requirement. Quality Assurance (QA) Testers typically don't contribute directly to the design and development phases of a product. They may have the opportunity to review and sign off on designs before they are implemented. The main accessibility role of a QA Tester in the accessibility lifecycle is to understand the accessibility requirements that exist and to run tests to ensure the product or feature conforms to those requirements. The testing roles have been split between automated and manual, but a number of QA professionals will do both." + }, + qaManual: { + title: "Manual Quality Assurance (QA) testing", + description: "Quality Assurance Testers responsible for manual testing will typically handle the testing that cannot be covered through the use of automated tools. They will typically be resources that are more knowledgeable about accessibility, with a deeper understanding of the requirements, and some experience operating assistive technologies for testing, such as screen readers. They will typically run a series of test cases to validate the degree of inclusion of the components of a screen and will be charged with making sure that the overall user experience is positive for people with disabilities. It is expected that manual testing will build on top of an automated testing process, in order to cover the remaining 65 to 70% of potential accessibility issues on any given screen.", + jobTitles: ["QA Analyst", "QA Specialist", "User Acceptance Tester", "Functional Tester"], + groupDescription: "QA Testers run automated test frameworks or manually test products to confirm correct operation based upon provided requirement. Quality Assurance (QA) Testers typically don't contribute directly to the design and development phases of a product. They may have the opportunity to review and sign off on designs before they are implemented. The main accessibility role of a QA Tester in the accessibility lifecycle is to understand the accessibility requirements that exist and to run tests to ensure the product or feature conforms to those requirements. The testing roles have been split between automated and manual, but a number of QA professionals will do both." + }, + productOwnership: { + title: "Product Ownership", + description: "Product owners own individual products and define their features and are key to defining the importance of accessibility on a project. It is their job to make sure that products are built and delivered in a way that meets business needs and user needs. They should have some basic understanding of the accessibility implications of the UI requirements they request, such as cost and required infrastructure. But, as with features in general, they delegate design and implementation decisions to other roles. As a result, they are typically not directly involved and do not have ownership in the ARRM model.", + jobTitles: ["Product Manager", "Product Owner", "Release Manager", "Business Owner"], + groupDescription: "The roles in this section cover managing the product and project, as well as other bureaucratic functions of the broader organization that often have a larger mandate than any individual project. Most administrative roles, as defined in this resource, have very little, if anything, to do with the design, the implementation, or the testing of accessibility principles to create more inclusive applications and websites. These roles, however, are still instrumental in ensuring that the team members who are actively taking part in making content accessible and conformant with WCAG can be successful at doing so. This begins with project managers and product owners working hand in hand with the design, development and testing teams, but also other governance roles contributing to steering the organization's culture in a direction that is aligned with the goals pursued by accessibility guidelines." + }, + projectManagement: { + title: "Project Management", + description: "Project managers are primarily responsible for keeping everything about the process of building a product organized and on track. They have little decision-making power directly impacting accessibility. The person managing the project should make sure that accessibility is built into estimates, user stories (if Agile), and requirements documents. In smaller teams, the roles of product owners and project managers often overlap.", + jobTitles: ["Project Manager", "Scrum Master (Agile)", "Team Lead"], + groupDescription: "The roles in this section cover managing the product and project, as well as other bureaucratic functions of the broader organization that often have a larger mandate than any individual project. Most administrative roles, as defined in this resource, have very little, if anything, to do with the design, the implementation, or the testing of accessibility principles to create more inclusive applications and websites. These roles, however, are still instrumental in ensuring that the team members who are actively taking part in making content accessible and conformant with WCAG can be successful at doing so. This begins with project managers and product owners working hand in hand with the design, development and testing teams, but also other governance roles contributing to steering the organization's culture in a direction that is aligned with the goals pursued by accessibility guidelines." + }, + governance: { + title: "Governance", + description: "Unlike most other administrative roles, governance is not part of an individual project team. Their mandate focuses on the big picture, often enterprise-wide initiatives. Most importantly to individual projects, governance roles are deliberative (often committee-based) and are not bound to the deadlines of a singular project without outside, executive influence to encourage higher-velocity decision making.", + jobTitles: ["Legal", "procurement", "conformance", "administrative", "governance", "branding"], + groupDescription: "The roles in this section cover managing the product and project, as well as other bureaucratic functions of the broader organization that often have a larger mandate than any individual project. Most administrative roles, as defined in this resource, have very little, if anything, to do with the design, the implementation, or the testing of accessibility principles to create more inclusive applications and websites. These roles, however, are still instrumental in ensuring that the team members who are actively taking part in making content accessible and conformant with WCAG can be successful at doing so. This begins with project managers and product owners working hand in hand with the design, development and testing teams, but also other governance roles contributing to steering the organization's culture in a direction that is aligned with the goals pursued by accessibility guidelines." + } + }, + fr: { + businessAnalysis: { + title: "Analyse d'affaires", + description: "Les analystes d'affaires participent à la conception ou à la modification de systèmes d'affaires ou de systèmes informatiques. Ils interagissent avec les parties prenantes et les experts en la matière afin de comprendre leurs problèmes et leurs besoins. Ils recueillent, documentent et analysent les besoins et exigences d'affaires pour aider à orienter l'équipe vers un résultat final qui répond aux besoins et attentes de l'organisation.", + jobTitles: ["Analyste d'affaires", "Commanditaire client"], + groupDescription: "Rédige les exigences d'affaires et/ou les récits utilisateur initiaux, s'assure que le projet livre les bénéfices d'affaires convenus." + }, + contentAuthoring: { + title: "Rédaction de contenu", + description: "La création de contenu est souvent utilisée en marketing, mais peut aussi être une tâche assignée à un rôle au sein d'une équipe de produit. La création de contenu implique la définition d'une stratégie de contenu, la rédaction ou la création du contenu ou des médias pour un produit. La personne qui rédige le contenu est responsable de s'assurer que le contenu est accessible aux personnes handicapées. La création de contenu s'étend aux rôles spécifiques de production de médias audio et vidéo. Celles-ci commencent par la rédaction de scripts mais peuvent s'étendre à la production des fichiers multimédias ou au support de contenu de diffusion en direct.", + keyDeliverables: ["Texte de base", "contenu géré", "scripts", "taxonomies", "directives de rédaction", "fichiers multimédias incluant PDF, audio et vidéo"], + tasks: ["Rédaction de contenu", "création de médias et de documentation", "définition de stratégies de contenu"], + jobTitles: ["Stratège de contenu", "Créateur de contenu", "Concepteur de contenu", "Auteur de contenu", "Rédacteur numérique", "Rédacteur UX", "Producteur de contenu", "Rédacteur technique", "Scénariste", "Producteur vidéo", "Animateur de podcast"], + groupDescription: "Ce rôle inclut la stratégie de contenu et la création de contenu, incluant la production audio/vidéo. Responsable de créer tout le texte présenté par le livrable sous toutes les formes (HTML, audio, vidéo). Définit ou sélectionne les normes que le contenu doit respecter et les processus pour sa révision et préparation." + }, + contentPublishing: { + title: "Publication de contenu", + description: "Membres d'équipe qui ne sont pas des développeurs web front-end et qui sont chargés de préparer le contenu pour la publication sur des sites web, produits, applications, etc. Ces membres d'équipe ne créent pas de contenu, ils travaillent plutôt avec le contenu dans des systèmes d'entreprise spécifiques ou des outils logiciels et appliquent des modifications au matériel généré par les auteurs de contenu. Les éditeurs de contenu peuvent effectuer certaines tâches qui font partie de l'ensemble de compétences du développeur web front-end, cependant ils ne sont pas des développeurs web et appliquent souvent cette balisage en utilisant des outils propriétaires et des widgets.", + keyDeliverables: ["Édition et formatage de contenu", "optimisation des métadonnées et SEO", "calendrier de publication de contenu", "compatibilité multiplateforme", "assurance qualité et tests"], + tasks: ["Balisage avancé dans un document PDF", "ajustement du timing des sous-titres", "création et édition de transcriptions", "conversion vers la documentation ePUB", "application de balises via un logiciel propriétaire pour générer une structure d'en-têtes", "SSML"], + jobTitles: ["Stratège de contenu", "Producteur de contenu", "Éditeur de contenu", "Spécialiste en technologie de publication", "Concepteur de contenu", "Éditeur vidéo", "Spécialiste en matériaux accessibles", "Développeur d'information", "Développeur de contenu", "Gestionnaire d'implémentation de publication"], + groupDescription: "Ce rôle inclut la stratégie de contenu et la création de contenu, incluant la production audio/vidéo. Responsable de créer tout le texte présenté par le livrable sous toutes les formes (HTML, audio, vidéo). Définit ou sélectionne les normes que le contenu doit respecter et les processus pour sa révision et préparation." + }, + uxResearch: { + title: "Recherche d'expérience utilisateur", + description: "Les chercheurs UX mènent des recherches exploratoires et génératives avec les utilisateurs finaux (par exemple, entretiens utilisateur, recherche ethnographique, etc.) pour recueillir leurs commentaires. La responsabilité de ce rôle est de fournir continuellement les commentaires des utilisateurs à ceux qui créent les produits. Ils testent les concepts existants et résument les insights utilisateur pour informer les actifs qui seront construits par les rôles en Conception d'expérience utilisateur (EU), conception visuelle, Développement front-end et création de contenu.", + keyDeliverables: ["Résultats d'études de recherche utilisateur modérées et non modérées", "tests d'utilisabilité et entretiens utilisateur (c'est-à-dire qu'un modérateur ou facilitateur était présent pendant le test, ou l'utilisateur final était seul)"], + tasks: ["Mener des recherches utilisateur avec un prototype partiel", "concept", "ou produit terminé"], + jobTitles: ["Chercheur utilisateur", "UXR (Chercheur d'expérience utilisateur)", "Analyste d'utilisabilité"], + groupDescription: "Ce groupe inclut la recherche utilisateur, l'expérience utilisateur (UX), et les décisions de présentation. Certains rôles de ce groupe définissent l'expérience utilisateur d'un produit, concevant ses comportements et interactions avec l'utilisateur final et/ou leurs technologies d'assistance. Certains rôles fournissent l'apparence générale des produits et fonctionnalités, couvrant la présentation, les polices et couleurs. D'autres décrivent la fonctionnalité des caractéristiques, et leur fonctionnement à travers les technologies d'assistance (TA). Ils traduisent les entrées des rôles d'affaires en récits utilisateur, exigences, spécifications, documentation et directives utilisées par d'autres rôles (principalement le développement) pour construire le produit fini. Cela inclut l'application de recherche utilisateur qui a été menée et une compréhension des audiences visées pour une expérience de qualité." + }, + uxDesign: { + title: "Conception d'expérience utilisateur", + description: "Les concepteurs UX peuvent potentiellement couvrir de nombreux domaines connexes, de la conceptualisation du parcours utilisateur au Développement front-end partiel. Aux fins de cette ressource, la Conception d'expérience utilisateur (EU) est définie par ses responsabilités principales, telles que l'architecture de l'information, la création de wireframes (maquettes d'écran de faible fidélité), et la création de prototypes qui définissent les interactions.", + keyDeliverables: ["Parcours utilisateur", "wireframes", "prototypes", "directives d'interaction", "architecture de l'information"], + tasks: ["Cartes de flux de travail / processus utilisateur", "conception d'expériences utilisateur", "cartographie des tâches et flux de travail utilisateur", "création et maintenance de personas utilisateur"], + jobTitles: ["Concepteur d'expérience utilisateur (UX)", "Concepteur de produit", "Concepteur web", "Concepteur de service"], + groupDescription: "Ce groupe inclut la recherche utilisateur, l'expérience utilisateur (UX), et les décisions de présentation. Certains rôles de ce groupe définissent l'expérience utilisateur d'un produit, concevant ses comportements et interactions avec l'utilisateur final et/ou leurs technologies d'assistance. Certains rôles fournissent l'apparence générale des produits et fonctionnalités, couvrant la présentation, les polices et couleurs. D'autres décrivent la fonctionnalité des caractéristiques, et leur fonctionnement à travers les technologies d'assistance (TA). Ils traduisent les entrées des rôles d'affaires en récits utilisateur, exigences, spécifications, documentation et directives utilisées par d'autres rôles (principalement le développement) pour construire le produit fini. Cela inclut l'application de recherche utilisateur qui a été menée et une compréhension des audiences visées pour une expérience de qualité." + }, + visualDesign: { + title: "Conception visuelle", + description: "Les concepteurs visuels se concentrent largement sur l'apparence et la sensation d'un produit, tel qu'un utilisateur final l'expérimenterait, visuellement ou autrement. Cela inclut la spécification de la conception originale des éléments d'interface et de la mise en page, le choix des polices et couleurs, et plus encore. Alors que la Conception d'expérience utilisateur (EU) se concentre sur comment quelque chose fonctionne, la conception visuelle se concentre sur comment cela apparaît et se ressent.", + keyDeliverables: ["Guides de style", "compositions de page", "maquettes de conception", "fichiers d'image"], + tasks: ["Style visuel", "logos et image de marque", "animation", "et conception d'iconographie"], + jobTitles: ["Concepteur visuel", "Concepteur d'interface utilisateur (UI)", "Concepteur d'interaction", "Graphiste"], + groupDescription: "Ce groupe inclut la recherche utilisateur, l'expérience utilisateur (UX), et les décisions de présentation. Certains rôles de ce groupe définissent l'expérience utilisateur d'un produit, concevant ses comportements et interactions avec l'utilisateur final et/ou leurs technologies d'assistance. Certains rôles fournissent l'apparence générale des produits et fonctionnalités, couvrant la présentation, les polices et couleurs. D'autres décrivent la fonctionnalité des caractéristiques, et leur fonctionnement à travers les technologies d'assistance (TA). Ils traduisent les entrées des rôles d'affaires en récits utilisateur, exigences, spécifications, documentation et directives utilisées par d'autres rôles (principalement le développement) pour construire le produit fini. Cela inclut l'application de recherche utilisateur qui a été menée et une compréhension des audiences visées pour une expérience de qualité." + }, + frontEndDev: { + title: "Développement front-end", + description: "Le Développement front-end construit typiquement les parties d'un produit qui seront interagies par l'utilisateur - spécifiquement, l'interface utilisateur. Aux fins de cette ressource, le Développement front-end fait référence à l'implémentation ou codification de la conception en modèles fonctionnels pour un produit utilisant des technologies telles que HTML, CSS et JavaScript.", + keyDeliverables: ["Fichiers HTML et CSS", "scripts côté client", "bibliothèques et frameworks JavaScript"], + tasks: ["Bibliothèques de modèles et prototypes", "fonctionnalités de modèles", "structures de documents HTML et widgets sémantiquement riches", "utiliser et adapter des frameworks et systèmes de gestion de contenu"], + jobTitles: ["Développeur front-end", "Développeur web", "Développeur full-stack", "Développeur UI/UX", "Développeur JavaScript", "Ingénieur UI/UX"], + groupDescription: "Supervise la création, le codage et la livraison du produit basé sur les exigences fournies. Responsable de tous les systèmes orientés utilisateur et de support, ainsi que de toute la sélection, configuration et déploiement d'infrastructure connexe." + }, + backEndDev: { + title: "Développement back-end", + description: "Les développeurs back-end ont une implication plus petite et plus indirecte avec le travail d'accessibilité, mais jouent toujours un rôle critique dans la livraison de produits accessibles, car l'architecture de produit sous-jacente peut informer les solutions d'accessibilité. Il est important que les développeurs back-end soient impliqués dans les discussions d'accessibilité afin que tout problème potentiel découlant de la façon dont la base de données est organisée puisse être attrapé et corrigé, ou mieux encore, évité complètement.", + jobTitles: ["Développeur back-end", "Développeur middleware", "Architecte de base de données", "Ingénieur de données"], + groupDescription: "Supervise la création, le codage et la livraison du produit basé sur les exigences fournies. Responsable de tous les systèmes orientés utilisateur et de support, ainsi que de toute la sélection, configuration et déploiement d'infrastructure connexe." + }, + qaAutomated: { + title: "Tests d'assurance qualité (AQ) automatisés", + description: "Les frameworks d'automatisation d'assurance qualité (AQ) s'exécutent typiquement contre les produits afin de tester les fonctionnalités et la fonctionnalité qui autrement incomberaient à un testeur AQ manuel. Aux fins de cette ressource, un testeur AQ effectuant des tests automatisés est responsable d'exécuter des tests dans un framework d'automatisation qui couvre les fonctionnalités et exigences d'accessibilité. Ceci peut être accompli soit par l'automatisation de tests fonctionnels, et/ou l'inclusion d'une bibliothèque de tests d'accessibilité dans le framework. Les testeurs AQ responsables des tests automatisés peuvent aussi typiquement exécuter des outils de tests d'accessibilité automatisés, tels que des extensions de navigateur ou des modules complémentaires. Il est attendu que les outils automatisés découvriront environ 30 à 35% des problèmes d'accessibilité potentiels sur un écran. Le reste sera identifié à travers la méthodologie de tests d'accessibilité manuels de l'équipe.", + jobTitles: ["Ingénieur d'automatisation AQ", "Ingénieur qualité", "Ingénieur d'automatisation"], + groupDescription: "Les testeurs AQ exécutent des frameworks de tests automatisés ou testent manuellement les produits pour confirmer le fonctionnement correct basé sur les exigences fournies. Les testeurs d'assurance qualité (AQ) ne contribuent typiquement pas directement aux phases de conception et développement d'un produit. Ils peuvent avoir l'opportunité de réviser et approuver les conceptions avant qu'elles soient implémentées. Le rôle principal d'accessibilité d'un testeur AQ dans le cycle de vie d'accessibilité est de comprendre les exigences d'accessibilité qui existent et d'exécuter des tests pour s'assurer que le produit ou la fonctionnalité se conforme à ces exigences. Les rôles de test ont été divisés entre automatisé et manuel, mais un nombre de professionnels AQ feront les deux." + }, + qaManual: { + title: "Tests d'assurance qualité (AQ) manuels", + description: "Les testeurs d'assurance qualité responsables des tests manuels géreront typiquement les tests qui ne peuvent pas être couverts par l'utilisation d'outils automatisés. Ils seront typiquement des ressources qui sont plus connaissantes sur l'accessibilité, avec une compréhension plus profonde des exigences, et une certaine expérience d'utilisation des technologies d'assistance pour les tests, telles que les lecteurs d'écran. Ils exécuteront typiquement une série de cas de test pour valider le degré d'inclusion des composants d'un écran et seront chargés de s'assurer que l'expérience utilisateur globale est positive pour les personnes handicapées. Il est attendu que les tests manuels s'appuieront sur un processus de tests automatisés, afin de couvrir les 65 à 70% restants des problèmes d'accessibilité potentiels sur tout écran donné.", + jobTitles: ["Analyste AQ", "Spécialiste AQ", "Testeur d'acceptation utilisateur", "Testeur fonctionnel"], + groupDescription: "Les testeurs AQ exécutent des frameworks de tests automatisés ou testent manuellement les produits pour confirmer le fonctionnement correct basé sur les exigences fournies. Les testeurs d'assurance qualité (AQ) ne contribuent typiquement pas directement aux phases de conception et développement d'un produit. Ils peuvent avoir l'opportunité de réviser et approuver les conceptions avant qu'elles soient implémentées. Le rôle principal d'accessibilité d'un testeur AQ dans le cycle de vie d'accessibilité est de comprendre les exigences d'accessibilité qui existent et d'exécuter des tests pour s'assurer que le produit ou la fonctionnalité se conforme à ces exigences. Les rôles de test ont été divisés entre automatisé et manuel, mais un nombre de professionnels AQ feront les deux." + }, + productOwnership: { + title: "Responsabilité du produit", + description: "Les propriétaires de produit possèdent des produits individuels et définissent leurs fonctionnalités et sont clés pour définir l'importance de l'accessibilité sur un projet. C'est leur travail de s'assurer que les produits sont construits et livrés d'une manière qui répond aux besoins d'affaires et aux besoins des utilisateurs. Ils devraient avoir une certaine compréhension de base des implications d'accessibilité des exigences UI qu'ils demandent, telles que le coût et l'infrastructure requise. Mais, comme avec les fonctionnalités en général, ils délèguent les décisions de conception et d'implémentation à d'autres rôles. En conséquence, ils ne sont typiquement pas directement impliqués et n'ont pas de propriété dans le modèle ARRM.", + jobTitles: ["Gestionnaire de produit", "Propriétaire de produit", "Gestionnaire de version", "Propriétaire d'affaires"], + groupDescription: "Les rôles de cette section couvrent la gestion du produit et du projet, ainsi que d'autres fonctions bureaucratiques de l'organisation plus large qui ont souvent un mandat plus large que tout projet individuel. La plupart des rôles administratifs, tels que définis dans cette ressource, ont très peu, voire rien, à voir avec la conception, l'implémentation, ou les tests des principes d'accessibilité pour créer des applications et sites web plus inclusifs. Ces rôles, cependant, sont toujours instrumentaux pour s'assurer que les membres d'équipe qui participent activement à rendre le contenu accessible et conforme aux WCAG peuvent réussir à le faire. Cela commence avec les gestionnaires de projet et propriétaires de produit travaillant main dans la main avec les équipes de conception, développement et test, mais aussi d'autres rôles de gouvernance contribuant à orienter la culture de l'organisation dans une direction qui est alignée avec les objectifs poursuivis par les directives d'accessibilité." + }, + projectManagement: { + title: "Gestion de projet", + description: "Les gestionnaires de projet sont principalement responsables de maintenir tout ce qui concerne le processus de construction d'un produit organisé et sur la bonne voie. Ils ont peu de pouvoir décisionnel impactant directement l'accessibilité. La personne gérant le projet devrait s'assurer que l'accessibilité est intégrée dans les estimations, les récits utilisateur (si Agile), et les documents d'exigences. Dans les petites équipes, les rôles de propriétaires de produit et gestionnaires de projet se chevauchent souvent.", + jobTitles: ["Gestionnaire de projet", "Scrum Master (Agile)", "Chef d'équipe"], + groupDescription: "Les rôles de cette section couvrent la gestion du produit et du projet, ainsi que d'autres fonctions bureaucratiques de l'organisation plus large qui ont souvent un mandat plus large que tout projet individuel. La plupart des rôles administratifs, tels que définis dans cette ressource, ont très peu, voire rien, à voir avec la conception, l'implémentation, ou les tests des principes d'accessibilité pour créer des applications et sites web plus inclusifs. Ces rôles, cependant, sont toujours instrumentaux pour s'assurer que les membres d'équipe qui participent activement à rendre le contenu accessible et conforme aux WCAG peuvent réussir à le faire. Cela commence avec les gestionnaires de projet et propriétaires de produit travaillant main dans la main avec les équipes de conception, développement et test, mais aussi d'autres rôles de gouvernance contribuant à orienter la culture de l'organisation dans une direction qui est alignée avec les objectifs poursuivis par les directives d'accessibilité." + }, + governance: { + title: "Gouvernance", + description: "Contrairement à la plupart des autres rôles administratifs, la gouvernance ne fait pas partie d'une équipe de projet individuelle. Leur mandat se concentre sur la vue d'ensemble, souvent des initiatives à l'échelle de l'entreprise. Plus important pour les projets individuels, les rôles de gouvernance sont délibératifs (souvent basés sur des comités) et ne sont pas liés aux échéances d'un projet singulier sans influence exécutive extérieure pour encourager une prise de décision à plus haute vélocité.", + jobTitles: ["Juridique", "approvisionnement", "conformité", "administratif", "gouvernance", "image de marque"], + groupDescription: "Les rôles de cette section couvrent la gestion du produit et du projet, ainsi que d'autres fonctions bureaucratiques de l'organisation plus large qui ont souvent un mandat plus large que tout projet individuel. La plupart des rôles administratifs, tels que définis dans cette ressource, ont très peu, voire rien, à voir avec la conception, l'implémentation, ou les tests des principes d'accessibilité pour créer des applications et sites web plus inclusifs. Ces rôles, cependant, sont toujours instrumentaux pour s'assurer que les membres d'équipe qui participent activement à rendre le contenu accessible et conforme aux WCAG peuvent réussir à le faire. Cela commence avec les gestionnaires de projet et propriétaires de produit travaillant main dans la main avec les équipes de conception, développement et test, mais aussi d'autres rôles de gouvernance contribuant à orienter la culture de l'organisation dans une direction qui est alignée avec les objectifs poursuivis par les directives d'accessibilité." + } + } + }, + + // detailed descriptions for groups + descriptions: { + en: { + business: "Business analysts and stakeholders who define requirements, conduct user research, and ensure digital products meet accessibility standards from a strategic perspective.", + author: "Content creators, writers, and publishers responsible for creating accessible content, including proper document structure, alternative text, and clear language.", + design: "User experience designers, visual designers, and researchers who create inclusive designs, conduct accessibility testing, and ensure usable interfaces for all users.", + development: "Front-end and back-end developers who implement accessible code, integrate assistive technologies, and build inclusive digital experiences.", + testing: "Quality assurance professionals who test for accessibility compliance, conduct automated and manual testing, and ensure products meet WCAG standards.", + administration: "Project managers, product owners, and governance teams who oversee accessibility strategy, ensure compliance, and manage accessibility initiatives.", + }, + fr: { + business: "Analystes d'affaires et parties prenantes qui définissent les exigences, mènent des recherches utilisateur et s'assurent que les produits numériques respectent les normes d'accessibilité d'un point de vue stratégique.", + author: "Créateurs de contenu, rédacteurs et éditeurs responsables de créer du contenu accessible, incluant une structure de document appropriée, du texte alternatif et un langage clair.", + design: "Concepteurs d'expérience utilisateur, concepteurs visuels et chercheurs qui créent des conceptions inclusives, effectuent des tests d'accessibilité et garantissent des interfaces utilisables pour tous.", + development: "Développeurs front-end et back-end qui implémentent du code accessible, intègrent les technologies d'assistance et construisent des expériences numériques inclusives.", + testing: "Professionnels de l'assurance qualité qui testent la conformité à l'accessibilité, effectuent des tests automatisés et manuels, et s'assurent que les produits respectent les normes WCAG.", + administration: "Gestionnaires de projet, propriétaires de produit et équipes de gouvernance qui supervisent la stratégie d'accessibilité, assurent la conformité et gèrent les initiatives d'accessibilité.", + }, + }, +}; diff --git a/src/_includes/layouts/base.njk b/src/_includes/layouts/base.njk index 4b15f8563..031913934 100644 --- a/src/_includes/layouts/base.njk +++ b/src/_includes/layouts/base.njk @@ -33,6 +33,17 @@ {% else %}

{{ landingPage[locale].descriptionNoneText }}

{% endif %} + {%- if role -%} +
+

Related roles:

+ + {%- endif -%} diff --git a/src/_includes/macros/contentType.njk b/src/_includes/macros/contentType.njk new file mode 100644 index 000000000..252a7f4f5 --- /dev/null +++ b/src/_includes/macros/contentType.njk @@ -0,0 +1,11 @@ +{%- macro getContentType(inputPath, locale) -%} + {%- if '/main/' in inputPath -%} + {%- if locale === "en" -%}Landing Page{%- else -%}Page d'atterrissage{%- endif -%} + {%- elif '/pages/' in inputPath -%} + {%- if locale === "en" -%}Content Page{%- else -%}Page de contenu{%- endif -%} + {%- elif '/links/' in inputPath -%} + {%- if locale === "en" -%}Link{%- else -%}Lien{%- endif -%} + {%- else -%} + Page + {%- endif -%} +{%- endmacro -%} diff --git a/src/_includes/partials/alert-landingpages.njk b/src/_includes/partials/alert-landingpages.njk index b8ca475c4..2c27a9080 100644 --- a/src/_includes/partials/alert-landingpages.njk +++ b/src/_includes/partials/alert-landingpages.njk @@ -1,7 +1,7 @@ {% if locale === "en" %}

We are currently in the process of collecting information on this subject. Please return in the near future for updates.

-

If you have any materials you would like to share, please feel free to visit our contact page. Thank you!

+

If you have any materials you would like to share, please feel free to visit our contact page. Thank you!

{% else %}

Nous travaillons actuellement à rassembler du contenue sur ce sujet. Veuillez revenir bientôt pour des mises à jour.

-

Si vous avez du matériel que vous souhaitez contribuer, veuillez visiter notre page de contact. Merci!

+

Si vous avez du matériel que vous souhaitez contribuer, veuillez visiter notre page de contact. Merci!

{% endif %} diff --git a/src/_includes/partials/breadcrumbs.njk b/src/_includes/partials/breadcrumbs.njk index a3e7ca024..751a6df61 100644 --- a/src/_includes/partials/breadcrumbs.njk +++ b/src/_includes/partials/breadcrumbs.njk @@ -73,23 +73,35 @@ Canada.ca > Digital Accessibility Toolkit > How to’s > Create web content > Ac {% if tags[0] != "main" and url != locale %} {% set counter = 3 %} {# Start the counter from 3, as 1 and 2 are already used #} - - {% if subject %} - {% for breadcrumb in subject %} -
  • - - {{ tagList.tags[locale][breadcrumb] or tagList.subjects[locale][breadcrumb] }} - - -
  • - {% set counter = counter + 1 %} - {% endfor %} - {% endif %} - - - {% if tags %} - {% for breadcrumb in tags %} - {% if breadcrumb != "updatesMain" %} + + {% if page.url.startsWith('/' + locale + '/roles/') and page.url != '/' + locale + '/roles/' %} + +
  • + + {{ tagList.subjects[locale].roles }} + + +
  • + {% set counter = counter + 1 %} + + + {% if pagination and pagination.items %} + {% set currentRole = pagination.items[pagination.pageNumber] %} + {% if currentRole.key and roles.roles[currentRole.key] %} + {% set groupKey = roles.roles[currentRole.key].group %} +
  • + + {{ roles.groups[locale][groupKey] }} + + +
  • + {% endif %} + {% endif %} + {% else %} + + + {% if subject %} + {% for breadcrumb in subject %}
  • {{ tagList.tags[locale][breadcrumb] or tagList.subjects[locale][breadcrumb] }} @@ -97,8 +109,23 @@ Canada.ca > Digital Accessibility Toolkit > How to’s > Create web content > Ac
  • {% set counter = counter + 1 %} - {% endif %} - {% endfor %} + {% endfor %} + {% endif %} + + + {% if tags %} + {% for breadcrumb in tags %} + {% if breadcrumb != "updatesMain" %} +
  • + + {{ tagList.tags[locale][breadcrumb] or tagList.subjects[locale][breadcrumb] }} + + +
  • + {% set counter = counter + 1 %} + {% endif %} + {% endfor %} + {% endif %} {% endif %} {% endif %} diff --git a/src/_includes/partials/pageLabel.njk b/src/_includes/partials/pageLabel.njk index 685f4e8ae..2c5d91dfd 100644 --- a/src/_includes/partials/pageLabel.njk +++ b/src/_includes/partials/pageLabel.njk @@ -1,9 +1,9 @@
    {% if locale === "en" %} -

    Subjects and tags

    +

    Subjects, tags and roles

    {% else %} -

    Sujets et étiquettes

    +

    Sujets, étiquettes et rôles

    {% endif %}
    {% if locale === "en" %} @@ -13,7 +13,7 @@ {% endif %}
    -
    +
    {% if subject %} subject:

      @@ -27,7 +27,7 @@ {% endif %} {% endif %}
    -
    +
    {% if tags %} tags:

      @@ -43,6 +43,22 @@ {% endif %} {% endif %}
    +
    + {% if role %} + roles:

    +
      + {% for item in role %} +
    • {{ item }}
    • + {% endfor %} +
    + {% else %} + {% if locale === "en" %} +

    There are no "roles"

    + {% else %} +

    Il n'y a pas de "rôles"

    + {% endif %} + {% endif %} +
    diff --git a/src/_includes/partials/pageListTable.njk b/src/_includes/partials/pageListTable.njk index a373cd3fc..39913d4a9 100644 --- a/src/_includes/partials/pageListTable.njk +++ b/src/_includes/partials/pageListTable.njk @@ -1,14 +1,27 @@ {% set branch = "main" %} +{% from "macros/contentType.njk" import getContentType %}

    {{ pageList[locale].definitionButtonText }}

    + + +
    + + + {% if locale === "en" %} + Download CSV Export + {% else %} + Télécharger l'export CSV + {% endif %} + +
    @@ -42,27 +66,42 @@
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • @@ -79,14 +118,18 @@
  • - +
    - - + + + + + + @@ -95,31 +138,32 @@ {% set otherLocale = "fr" if locale === "en" else "en" %} {% set toggleURL = entry.inputPath | replace("\./src/" + locale + "/", "/" + otherLocale + "/") %} {% set isLanding = entry.inputPath | replace("/", ",") %} - {% if locale === "en" %} - {% set missingToggle = "Missing french version" %} - {% else %} - {% set missingToggle = "Version anglais manquante" %} - {% endif %} {% if entry.data.locale == locale %} {% if entry.data.redirect %} + {% elif entry.inputPath.endsWith('.csv.njk') %} {% else %} - + - - + + + + + + {% endif %} {% endif %} diff --git a/src/_includes/partials/role-content-coming-soon.njk b/src/_includes/partials/role-content-coming-soon.njk new file mode 100644 index 000000000..36e982ef4 --- /dev/null +++ b/src/_includes/partials/role-content-coming-soon.njk @@ -0,0 +1,8 @@ +{# + Role content coming soon alert + Usage: {% include "partials/role-content-coming-soon.njk" %} + Optional parameter: variant="group" for group pages (changes the text slightly) +#} +
    +

    {{ alerts[locale].roleContentComingSoon }} {% if variant == "group" %}{{ alerts[locale].roleContentComingSoonTextGroup }}{% else %}{{ alerts[locale].roleContentComingSoonText }}{% endif %}

    +
    diff --git a/src/_includes/partials/role-group-sections.njk b/src/_includes/partials/role-group-sections.njk new file mode 100644 index 000000000..f07370e02 --- /dev/null +++ b/src/_includes/partials/role-group-sections.njk @@ -0,0 +1,45 @@ +{# expects: lang, locale, rolesData, groupRoleKeys, collections, pathPrefix, landingPage, alerts #} +{% for rk in groupRoleKeys %} +{% set label = rolesData.labels[lang][rk] or rk %} +{% set anchor = label | stripTagsSlugify %} +{% set items = collections.rolePages +| byAnyRole([rk]) +| localeMatch(locale) +| sort(false, false, 'data.title') %} + +
    +

    {{ label }}

    +

    {% if lang == 'fr' %}Aller à la page {{ label | lower }}{% else %}Go to {{ label | lower }} page{% endif %}{% if items.length %} ({{ items.length }}){% endif %}

    + + {% if items.length %} +
    + {% for item in items %} +
    +

    + + {% if item.data.internal === true %} + + {{ alerts[locale].hiddenTextLink }} + {% endif %} + {{ item.data.title | safe }} + {% if item.data.oneLanguage %} {{ landingPage[locale].otherLangOnly }}{% endif %} + +

    +

    + {% if item.data.description %} + {{ item.data.description | safe }} + {% else %} + {{ landingPage[locale].descriptionNoneText }} + {% endif %} +

    +
    + {% endfor %} +
    + {% else %} + {% set variant = "group" %} + {% include "partials/role-content-coming-soon.njk" %} + {% endif %} +
    +{% endfor %} diff --git a/src/_includes/partials/role-mini-toc.njk b/src/_includes/partials/role-mini-toc.njk new file mode 100644 index 000000000..89d9deedc --- /dev/null +++ b/src/_includes/partials/role-mini-toc.njk @@ -0,0 +1,18 @@ +{# expects: lang, locale, rolesData, groupRoleKeys, collections #} + diff --git a/src/main/en/accessibility-in-your-role.njk b/src/main/en/accessibility-in-your-role.njk deleted file mode 100644 index 016c66640..000000000 --- a/src/main/en/accessibility-in-your-role.njk +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Accessibility in your role -description: We all have a role to play in accessibility. Learn more about job-specific accessibility tips and how to integrate them into your day-to-day work. -toggle: l-accessibilite-dans-votre-role -tags: ---- - -{% if collections.accessibilityInYourRole === undefined %} - - {% include "partials/alert-landingpages.njk" %} - -{% else %} - -
    - {% for item in collections.accessibilityInYourRole | sort(false, false, 'data.title') | localeMatch(locale) %} -
    -

    {% if item.data.internal === true %} {{ alerts[locale].hiddenTextLink }}{% endif %}{{ item.data.title | safe }}{% if item.data.oneLanguage %} {{ landingPage[locale].otherLangOnly }}{% endif %}

    -

    - {% if item.data.description %} - {{ item.data.description | safe }} - {% else %} - {{ landingPage[locale].descriptionNoneText }} - {% endif %} -

    -
    - {% endfor %} -
    - -{% endif %} diff --git a/src/main/en/pages.csv.njk b/src/main/en/pages.csv.njk new file mode 100644 index 000000000..838b1aeeb --- /dev/null +++ b/src/main/en/pages.csv.njk @@ -0,0 +1,53 @@ +--- +permalink: "/docs/pages-en.csv" +layout: false +eleventyExcludeFromCollections: true +date: "git Last Modified" +--- +{%- from "macros/contentType.njk" import getContentType -%} +{%- set roles_data = roles -%} +{%- macro csv(val) -%} + "{{ (val | default('') | string | replace('"', '""')) }}" +{%- endmacro -%} +{%- macro listify(val) -%} + {%- if val is defined and val is not none -%} + {%- if val is string -%} + {{ val }} + {%- elif val is iterable -%} + {{ val | join('; ') }} + {%- endif -%} + {%- endif -%} +{%- endmacro -%} + +{%- macro roleLabels(val, locale) -%} + {%- if val is defined and val is not none -%} + {%- if val is string -%} + {{ roles_data.labels[locale][val] or val }} + {%- elif val is iterable -%} + {%- set labelList = "" -%} + {%- for item in val -%} + {%- set label = roles_data.labels[locale][item] or item -%} + {%- if loop.first -%} + {%- set labelList = label -%} + {%- else -%} + {%- set labelList = labelList + "; " + label -%} + {%- endif -%} + {%- endfor -%} + {{ labelList }} + {%- endif -%} + {%- endif -%} +{%- endmacro -%} +Title,URL,Roles (keys),Subjects,Tags,Toggle,Layout,Date Modified,Date Created,Content Type,Source +{% for item in (collections.all | localeMatch('en')) %} +{%- if item.data.permalink != false and not item.data.redirect and not item.inputPath.endsWith('.csv.njk') -%} +{%- set roleVal = item.data.role -%} +{%- set subjectsVal = item.data.subjects or item.data.subject -%} +{%- set tagsVal = item.data.tags -%} +{%- set toggleVal = item.data.toggle -%} +{%- set urlVal = item.url -%} +{%- set layoutVal = item.data.layout -%} +{%- set modifiedVal = item.date | postDate -%} +{%- set createdVal = item.data.gitCreated | postDate if item.data.gitCreated else settings.dateCreated -%} +{{ csv(item.data.title | striptags) }},{{ csv(urlVal) }},{{ csv(listify(roleVal)) }},{{ csv(listify(subjectsVal)) }},{{ csv(listify(tagsVal)) }},{{ csv(toggleVal) }},{{ csv(layoutVal) }},{{ csv(modifiedVal) }},{{ csv(createdVal) }},{{ csv(getContentType(item.inputPath, "en")) }},{{ csv(item.inputPath) }} +{% endif -%} +{%- endfor %} diff --git a/src/main/en/role.njk b/src/main/en/role.njk new file mode 100644 index 000000000..b7eac863f --- /dev/null +++ b/src/main/en/role.njk @@ -0,0 +1,102 @@ +--- +tags: role +eleventyExcludeFromCollections: true +pagination: + data: rolePairs # global (see below) + size: 1 + alias: rolePair # [roleKey, roleMeta] +permalink: "/{{ locale }}/roles/{{ rolePair[0] }}/" +eleventyComputed: + title: "{{ roles.labels[locale][rolePair[0]] }}" + description: "{{ roles.arrm[locale][rolePair[0]].description if roles.arrm[locale][rolePair[0]] else 'Resources and guidance for ' + roles.labels[locale][rolePair[0]] | lower + ' roles in digital accessibility.' }}" + toggle: "roles/{{ rolePair[0] }}" +--- +{% set lang = locale or 'en' %} +{% set rolesData = roles %} +{% set roleKey = rolePair[0] %} +{% set groupKey = rolesData.roles[roleKey].group %} +{% set groupName = rolesData.groups[lang][groupKey] %} + +
    +

    + {{ rolesData.labels[lang][roleKey] }} + Part of the {{ groupName }} +

    +
    + +{% if rolesData.arrm[lang][roleKey] %} +
    + {% if rolesData.arrm[lang][roleKey].keyDeliverables %} +

    Key deliverable examples:

    + + {% endif %} + + {% if rolesData.arrm[lang][roleKey].tasks %} +

    Tasks include:

    + + {% endif %} + +

    Example job titles for this role:

    + + + {% if rolesData.arrm[lang][roleKey].groupDescription %} +

    Role group description:

    +

    {{ rolesData.arrm[lang][roleKey].groupDescription }}

    + {% endif %} + +

    This role description is adapted from the W3C WAI Accessibility Roles and Responsibilities Mapping (ARRM). You are welcome to use this information as is, or change it for your situation.

    +
    +{% endif %} + +{% set items = collections.rolePages + | byAnyRole([roleKey]) + | localeMatch(locale) + | sort(false, false, 'data.title') %} + +{% if items.length %} +
    +

    Resources and guidance

    +
    + {% for item in items %} +
    +

    + + {% if item.data.internal === true %} + + {{ alerts[locale].hiddenTextLink }} + {% endif %} + {{ item.data.title | safe }} + {% if item.data.oneLanguage %} {{ landingPage[locale].otherLangOnly }}{% endif %} + +

    +

    + {% if item.data.description %} + {{ item.data.description | safe }} + {% else %} + {{ landingPage[locale].descriptionNoneText }} + {% endif %} +

    +
    + {% endfor %} +
    +
    +{% else %} +
    +

    Resources and guidance

    + {% include "partials/role-content-coming-soon.njk" %} +
    +{% endif %} diff --git a/src/main/en/roles-group.njk b/src/main/en/roles-group.njk new file mode 100644 index 000000000..2b716960e --- /dev/null +++ b/src/main/en/roles-group.njk @@ -0,0 +1,21 @@ +--- +tags: roleGroup +eleventyExcludeFromCollections: true +pagination: + data: groupPairsEn # make this global (see below) + size: 1 + alias: groupPair # [key, label, description, roleLabels] +permalink: "/{{ locale }}/roles/{{ groupPair[0] }}/" +eleventyComputed: + title: "{{ groupPair[1] }}" + description: "{{ groupPair[2] }}" + toggle: "roles/{{ groupPair[0] }}" +--- +{% set lang = locale or 'en' %} +{% set rolesData = roles %} +{% set groupKey = groupPair[0] %} +{% set groupRoleKeys = groupKey | roleKeysForGroup(rolesData) %} + +{% include "partials/role-mini-toc.njk" %} +{% include "partials/role-group-sections.njk" %} + diff --git a/src/main/en/roles/index.njk b/src/main/en/roles/index.njk new file mode 100644 index 000000000..6d609ed7b --- /dev/null +++ b/src/main/en/roles/index.njk @@ -0,0 +1,27 @@ +--- +title: Accessibility in your role +description: An overview of roles and responsibilities for ensuring accessibility in digital products and services, based on the Accessibility Roles and Responsibilities Mapping (ARRM) from the World Wide Web Consortium (W3C) - Web Accessibility Initiative (WAI). +permalink: '/{{ locale }}/roles/' +toggle: roles +eleventyExcludeFromCollections: true +tags: + - main +--- + +{% include "partials/alert-landingpages.njk" %} + +
    + {% for roleGroup in groupPairsEn %} +
    +

    + {{ roleGroup[1] }} +

    + +

    {{ roleGroup[2] }}

    +
    + {% endfor %} +
    diff --git a/src/main/fr/l-accessibilite-dans-votre-role.njk b/src/main/fr/l-accessibilite-dans-votre-role.njk deleted file mode 100644 index bff1f9a77..000000000 --- a/src/main/fr/l-accessibilite-dans-votre-role.njk +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: L'accessibilité dans votre rôle -description: Nous avons tous un rôle à jouer en matière d'accessibilité. Apprenez-en plus sur les conseils d'accessibilité spécifiques à votre emploi et sur la manière de les intégrer dans votre travail quotidien. -toggle: accessibility-in-your-role -tags: ---- -{% if collections.accessibilityInYourRole === undefined %} - - {% include "partials/alert-landingpages.njk" %} - -{% else %} - -
    - {% for item in collections.accessibilityInYourRole | sort(false, false, 'data.title') | localeMatch(locale) %} -
    -

    {% if item.data.internal === true %} {{ alerts[locale].hiddenTextLink }}{% endif %}{{ item.data.title | safe }}{% if item.data.oneLanguage %} {{ landingPage[locale].otherLangOnly }}{% endif %}

    -

    - {% if item.data.description %} - {{ item.data.description | safe }} - {% else %} - {{ landingPage[locale].descriptionNoneText }} - {% endif %} -

    -
    - {% endfor %} -
    - -{% endif %} diff --git a/src/main/fr/pages.csv.njk b/src/main/fr/pages.csv.njk new file mode 100644 index 000000000..56c90874d --- /dev/null +++ b/src/main/fr/pages.csv.njk @@ -0,0 +1,53 @@ +--- +permalink: "/docs/pages-fr.csv" +layout: false +eleventyExcludeFromCollections: true +date: "git Last Modified" +--- +{%- from "macros/contentType.njk" import getContentType -%} +{%- set roles_data = roles -%} +{%- macro csv(val) -%} + "{{ (val | default('') | string | replace('"', '""')) }}" +{%- endmacro -%} +{%- macro listify(val) -%} + {%- if val is defined and val is not none -%} + {%- if val is string -%} + {{ val }} + {%- elif val is iterable -%} + {{ val | join('; ') }} + {%- endif -%} + {%- endif -%} +{%- endmacro -%} + +{%- macro roleLabels(val, locale) -%} + {%- if val is defined and val is not none -%} + {%- if val is string -%} + {{ roles_data.labels[locale][val] or val }} + {%- elif val is iterable -%} + {%- set labelList = "" -%} + {%- for item in val -%} + {%- set label = roles_data.labels[locale][item] or item -%} + {%- if loop.first -%} + {%- set labelList = label -%} + {%- else -%} + {%- set labelList = labelList + "; " + label -%} + {%- endif -%} + {%- endfor -%} + {{ labelList }} + {%- endif -%} + {%- endif -%} +{%- endmacro -%} +Titre,URL,Rôles (clés),Sujets,Étiquettes,Basculer,Mise en page,Date de modification,Date de création,Type de contenu,Source +{% for item in (collections.all | localeMatch('fr')) %} +{%- if item.data.permalink != false and not item.data.redirect and not item.inputPath.endsWith('.csv.njk') -%} +{%- set roleVal = item.data.role -%} +{%- set subjectsVal = item.data.subjects or item.data.subject -%} +{%- set tagsVal = item.data.tags -%} +{%- set toggleVal = item.data.toggle -%} +{%- set urlVal = item.url -%} +{%- set layoutVal = item.data.layout -%} +{%- set modifiedVal = item.date | postDate -%} +{%- set createdVal = item.data.gitCreated | postDate if item.data.gitCreated else settings.dateCreated -%} +{{ csv(item.data.title | striptags) }},{{ csv(urlVal) }},{{ csv(listify(roleVal)) }},{{ csv(listify(subjectsVal)) }},{{ csv(listify(tagsVal)) }},{{ csv(toggleVal) }},{{ csv(layoutVal) }},{{ csv(modifiedVal) }},{{ csv(createdVal) }},{{ csv(getContentType(item.inputPath, "fr")) }},{{ csv(item.inputPath) }} +{% endif -%} +{%- endfor %} diff --git a/src/main/fr/role.njk b/src/main/fr/role.njk new file mode 100644 index 000000000..f32ce41da --- /dev/null +++ b/src/main/fr/role.njk @@ -0,0 +1,102 @@ +--- +tags: role +eleventyExcludeFromCollections: true +pagination: + data: rolePairs + size: 1 + alias: rolePair +permalink: "/{{ locale }}/roles/{{ rolePair[0] }}/" +eleventyComputed: + title: "{{ roles.labels[locale][rolePair[0]] }}" + description: "{{ roles.arrm[locale][rolePair[0]].description if roles.arrm[locale][rolePair[0]] else 'Ressources et conseils pour les rôles de ' + roles.labels[locale][rolePair[0]] | lower + ' en accessibilité numérique.' }}" + toggle: "roles/{{ rolePair[0] }}" +--- +{% set lang = locale or 'fr' %} +{% set rolesData = roles %} +{% set roleKey = rolePair[0] %} +{% set groupKey = rolesData.roles[roleKey].group %} +{% set groupName = rolesData.groups[lang][groupKey] %} + +
    +

    + {{ rolesData.labels[lang][roleKey] }} + Fait partie du {{ groupName }} +

    +
    + +{% if rolesData.arrm[lang][roleKey] %} +
    + {% if rolesData.arrm[lang][roleKey].keyDeliverables %} +

    Exemples de livrables clés :

    + + {% endif %} + + {% if rolesData.arrm[lang][roleKey].tasks %} +

    Les tâches incluent :

    + + {% endif %} + +

    Exemples de titres d'emploi pour ce rôle :

    + + + {% if rolesData.arrm[lang][roleKey].groupDescription %} +

    Description du groupe de rôles :

    +

    {{ rolesData.arrm[lang][roleKey].groupDescription }}

    + {% endif %} + +

    Cette description de rôle est adaptée du W3C WAI Accessibility Roles and Responsibilities Mapping (ARRM). Vous êtes libre d'utiliser ces informations telles quelles, ou de les modifier selon votre situation.

    +
    +{% endif %} + +{% set items = collections.rolePages + | byAnyRole([roleKey]) + | localeMatch(locale) + | sort(false, false, 'data.title') %} + +{% if items.length %} +
    +

    Ressources et conseils

    +
    + {% for item in items %} +
    +

    + + {% if item.data.internal === true %} + + {{ alerts[locale].hiddenTextLink }} + {% endif %} + {{ item.data.title | safe }} + {% if item.data.oneLanguage %} {{ landingPage[locale].otherLangOnly }}{% endif %} + +

    +

    + {% if item.data.description %} + {{ item.data.description | safe }} + {% else %} + {{ landingPage[locale].descriptionNoneText }} + {% endif %} +

    +
    + {% endfor %} +
    +
    +{% else %} +
    +

    Ressources et conseils

    + {% include "partials/role-content-coming-soon.njk" %} +
    +{% endif %} diff --git a/src/main/fr/roles-group.njk b/src/main/fr/roles-group.njk new file mode 100644 index 000000000..d3ecf34c4 --- /dev/null +++ b/src/main/fr/roles-group.njk @@ -0,0 +1,20 @@ +--- +tags: roleGroup +eleventyExcludeFromCollections: true +pagination: + data: groupPairsFr + size: 1 + alias: groupPair +permalink: "/{{ locale }}/roles/{{ groupPair[0] }}/" +eleventyComputed: + title: "{{ groupPair[1] }}" + description: "{{ groupPair[2] }}" + toggle: "roles/{{ groupPair[0] }}" +--- +{% set lang = locale or 'fr' %} +{% set rolesData = roles %} +{% set groupKey = groupPair[0] %} +{% set groupRoleKeys = groupKey | roleKeysForGroup(rolesData) %} + +{% include "partials/role-mini-toc.njk" %} +{% include "partials/role-group-sections.njk" %} diff --git a/src/main/fr/roles/index.njk b/src/main/fr/roles/index.njk new file mode 100644 index 000000000..aec8677f7 --- /dev/null +++ b/src/main/fr/roles/index.njk @@ -0,0 +1,27 @@ +--- +title: L’accessibilité dans votre rôle +description: Aperçu des rôles et responsabilités pour assurer l’accessibilité dans les produits et services numériques, basé sur la cartographie des rôles et responsabilités d’accessibilité du World Wide Web Consortium (W3C) - Web Accessibility Initiative (WAI). +permalink: '/{{ locale }}/roles/' +toggle: roles +eleventyExcludeFromCollections: true +tags: + - main +--- + +{% include "partials/alert-landingpages.njk" %} + +
    + {% for roleGroup in groupPairsFr %} +
    +

    + {{ roleGroup[1] }} +

    + +

    {{ roleGroup[2] }}

    +
    + {% endfor %} +
    {% if locale === "en" %}Title{% else %}Titre{% endif %}{% if locale === "en" %}Other language link{% else %}Lien vers d'autres langues{% endif %} {{ pageList[locale].tagsText }} {{ pageList[locale].subjectsText }}{% if locale === "en" %}Link to file{% else %}Lien vers le fichier{% endif %}{% if locale === "en" %}Role{% else %}Rôle{% endif %}{% if locale === "en" %}Layout{% else %}Mise en page{% endif %}{% if locale === "en" %}Date Modified{% else %}Date de modification{% endif %}{% if locale === "en" %}Date Created{% else %}Date de création{% endif %}{% if locale === "en" %}Content Type{% else %}Type de contenu{% endif %}{% if locale === "en" %}Link to file{% else %}Lien vers le fichier{% endif %}
    {{ entry.data.title | safe }} - {% if entry.data.toggle %} - {% if locale === "en" %}French version{% else %}Version anglaise{% endif %} {% if locale === "en" %}of{% else %}de{% endif %} {{ entry.data.title | safe }} - {% else %} - {{ missingToggle }} - {% endif %} - {% for item in entry.data.tags %} {{ item }} {% endfor %} {{ entry.data.subject }}{{ newPath }} + {% if entry.data.role %} + {% set roleList = entry.data.role if entry.data.role is iterable and entry.data.role is not string else [entry.data.role] %} + {% for roleItem in roleList %} + {{ roleItem }} + {% endfor %} + {% endif %} + {{ entry.data.layout or "" }}{{ entry.date | postDate if entry.date else "" }}{{ entry.data.gitCreated | postDate if entry.data.gitCreated else "" }}{{ getContentType(entry.inputPath, locale) }}{{ newPath }}