diff --git a/.build_scripts/deploy.sh b/.build_scripts/deploy.sh deleted file mode 100644 index dc57ee000..000000000 --- a/.build_scripts/deploy.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -set -e # halt script on error - -# If this is the deploy branch, push it up to gh-pages -if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = ${DEPLOY_BRANCH} ]; then - echo "Get ready, we're pushing to gh-pages!" - cd _site - git init - git config user.name "Travis-CI" - git config user.email "travis@somewhere.com" - git add . - git commit -m "CI deploy to gh-pages" - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master > /dev/null 2>&1 -else - echo "Not a publishable branch so we're all done here" -fi diff --git a/.build_scripts/lint.sh b/.build_scripts/lint.sh deleted file mode 100644 index 63821a57b..000000000 --- a/.build_scripts/lint.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -e # halt script on error -# If deploying, don't balk on lint errors -if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = ${DEPLOY_BRANCH} ]; then - npm run lint || true -else - npm run lint -fi diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 71bd91669..000000000 --- a/.eslintrc +++ /dev/null @@ -1,189 +0,0 @@ -{ - "ecmaFeatures": { - "globalReturn": true, - "jsx": true, - "modules": true - }, - - "env": { - "browser": false, - "es6": true, - "node": true, - }, - - "globals": { - "document": false, - "escape": false, - "navigator": false, - "unescape": false, - "window": false - }, - - "plugins": [ - "react" - ], - - "rules": { - "block-scoped-var": 0, - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - "camelcase": 0, - "comma-dangle": [2, "never"], - "comma-spacing": [2, { "before": false, "after": true }], - "comma-style": [2, "last"], - "complexity": 0, - "consistent-return": 0, - "consistent-this": 0, - "curly": [2, "multi-line"], - "default-case": 0, - "dot-notation": 0, - "eol-last": 2, - "eqeqeq": [2, "allow-null"], - "func-names": 0, - "func-style": [0, "declaration"], - "generator-star": [2, "middle"], - "guard-for-in": 0, - "handle-callback-err": [2, "^(err|error|anySpecificError)$" ], - "indent": [2, 2], - "key-spacing": [2, { "beforeColon": false, "afterColon": true }], - "max-depth": 0, - "max-len": 0, - "max-nested-callbacks": 0, - "max-params": 0, - "max-statements": 0, - "new-cap": [2, { "newIsCap": true, "capIsNew": false }], - "new-parens": 2, - "no-alert": 0, - "no-array-constructor": 2, - "no-bitwise": 0, - "no-caller": 2, - "no-catch-shadow": 0, - "no-cond-assign": 2, - "no-console": 0, - "no-constant-condition": 0, - "no-control-regex": 2, - "no-debugger": 2, - "no-delete-var": 2, - "no-div-regex": 0, - "no-dupe-args": 2, - "no-dupe-keys": 2, - "no-duplicate-case": 2, - "no-else-return": 0, - "no-empty": 0, - "no-empty-class": 2, - "no-empty-label": 2, - "no-eq-null": 0, - "no-eval": 2, - "no-ex-assign": 2, - "no-extend-native": 2, - "no-extra-bind": 2, - "no-extra-boolean-cast": 2, - "no-extra-parens": 0, - "no-extra-semi": 0, - "no-extra-strict": 0, - "no-fallthrough": 2, - "no-floating-decimal": 2, - "no-func-assign": 2, - "no-implied-eval": 2, - "no-inline-comments": 0, - "no-inner-declarations": [2, "functions"], - "no-invalid-regexp": 2, - "no-irregular-whitespace": 2, - "no-iterator": 2, - "no-label-var": 2, - "no-labels": 2, - "no-lone-blocks": 0, - "no-lonely-if": 0, - "no-loop-func": 0, - "no-mixed-requires": [0, false], - "no-mixed-spaces-and-tabs": [2, false], - "no-multi-spaces": 2, - "no-multi-str": 2, - "no-multiple-empty-lines": [2, { "max": 1 }], - "no-native-reassign": 2, - "no-negated-in-lhs": 2, - "no-nested-ternary": 0, - "no-new": 2, - "no-new-func": 2, - "no-new-object": 2, - "no-new-require": 2, - "no-new-wrappers": 2, - "no-obj-calls": 2, - "no-octal": 2, - "no-octal-escape": 2, - "no-path-concat": 0, - "no-plusplus": 0, - "no-process-env": 0, - "no-process-exit": 0, - "no-proto": 2, - "no-redeclare": 2, - "no-regex-spaces": 2, - "no-reserved-keys": 0, - "no-restricted-modules": 0, - "no-return-assign": 2, - "no-script-url": 0, - "no-self-compare": 2, - "no-sequences": 2, - "no-shadow": 0, - "no-shadow-restricted-names": 2, - "no-spaced-func": 2, - "no-sparse-arrays": 2, - "no-sync": 0, - "no-ternary": 0, - "no-throw-literal": 2, - "no-trailing-spaces": 2, - "no-undef": 2, - "no-undef-init": 2, - "no-undefined": 0, - "no-underscore-dangle": 0, - "no-unreachable": 2, - "no-unused-expressions": 0, - "no-unused-vars": [2, { "vars": "all", "args": "none" }], - "no-use-before-define": 0, - "no-var": 0, - "no-void": 0, - "no-warning-comments": [0, { "terms": ["todo", "fixme", "xxx"], "location": "start" }], - "no-with": 2, - "no-wrap-func": 2, - "one-var": 0, - "operator-assignment": [0, "always"], - "padded-blocks": [2, "never"], - "quote-props": 0, - "quotes": [2, "single", "avoid-escape"], - "radix": 2, - "react/display-name": 2, - "react/jsx-boolean-value": 2, - "react/jsx-quotes": [2, "single", "avoid-escape"], - "react/jsx-no-undef": 2, - "react/jsx-sort-props": 0, - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/no-did-mount-set-state": 2, - "react/no-did-update-set-state": 2, - "react/no-multi-comp": 2, - "react/no-unknown-property": 2, - "react/prop-types": 2, - "react/react-in-jsx-scope": 2, - "react/self-closing-comp": 2, - "react/wrap-multilines": 2, - "semi": [2, "always"], - "semi-spacing": 0, - "sort-vars": 0, - "space-after-keywords": [2, "always"], - "space-before-blocks": [2, "always"], - "space-before-function-paren": [2, "always"], - "space-in-brackets": 0, - "space-in-parens": [2, "never"], - "space-infix-ops": 2, - "space-return-throw-case": 2, - "space-unary-ops": [2, { "words": true, "nonwords": false }], - "spaced-line-comment": [2, "always"], - "strict": 0, - "use-isnan": 2, - "valid-jsdoc": 0, - "valid-typeof": 2, - "vars-on-top": 0, - "wrap-iife": [2, "any"], - "wrap-regex": 0, - "yoda": [2, "never"] - } -} \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..6adc6894e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,78 @@ +name: Bug Report +description: Report a bug or issue with the Missing Maps website +title: "[Bug]: " +labels: ["bug", "needs-triage"] +assignees: [] + +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report a bug! Please fill out the form below to help us understand and reproduce the issue. + + - type: input + id: url + attributes: + label: Page URL + description: What page were you on when you encountered the bug? + placeholder: https://www.missingmaps.org/... + validations: + required: false + + - type: textarea + id: description + attributes: + label: Bug Description + description: A clear and concise description of what the bug is + placeholder: Describe what happened and what you expected to happen + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Steps to Reproduce + description: How can we reproduce this bug? + placeholder: | + 1. Go to... + 2. Click on... + 3. Scroll down to... + 4. See error + validations: + required: true + + - type: dropdown + id: browsers + attributes: + label: Browser + description: What browser are you using? + options: + - Chrome + - Firefox + - Safari + - Edge + - Mobile Safari + - Mobile Chrome + - Other + validations: + required: false + + - type: dropdown + id: device + attributes: + label: Device Type + description: What type of device are you using? + options: + - Desktop + - Mobile + - Tablet + validations: + required: false + + - type: textarea + id: additional + attributes: + label: Additional Context + description: Add any other context about the problem here, including screenshots if helpful + validations: + required: false \ No newline at end of file diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 000000000..08f5c2e0e --- /dev/null +++ b/.github/README.md @@ -0,0 +1,60 @@ +# GitHub Actions Workflows + +This directory contains the CI/CD workflows for the Missing Maps website. + +## Workflows + +### 📦 `deploy.yml` - CI/CD Pipeline +- **Triggers**: Push to `main`, `master`, or `publish` branches; Pull requests +- **Purpose**: Build and deploy the site to GitHub Pages +- **Features**: + - Ruby and Node.js environment setup + - Dependency caching + - JavaScript linting + - Jekyll build with Gulp + - Automated deployment to GitHub Pages (publish branch only) + +### 🧪 `test.yml` - Pull Request Tests +- **Triggers**: Pull requests to main branches +- **Purpose**: Test builds and validate changes +- **Features**: + - Build verification + - Asset generation checks + - Lint validation + +### 🔒 `security.yml` - Security and Dependency Checks +- **Triggers**: Weekly schedule, dependency file changes, manual trigger +- **Purpose**: Monitor security and dependency health +- **Features**: + - NPM security audit + - Ruby security audit with bundler-audit + - Outdated dependency checks + - Code linting and formatting validation + +## Dependabot Configuration + +The `.github/dependabot.yml` file configures automated dependency updates: +- **NPM packages**: Weekly updates on Sundays +- **Ruby gems**: Weekly updates on Sundays +- **GitHub Actions**: Weekly updates on Sundays +- **Grouping**: Development vs production dependencies +- **Auto-assignment**: PRs assigned to maintainers + +## Migration from Travis CI + +This setup replaces the previous Travis CI configuration with modern GitHub Actions: +- ✅ Improved security with GitHub's built-in secrets management +- ✅ Better integration with GitHub features +- ✅ More granular control over workflows +- ✅ Built-in GitHub Pages deployment +- ✅ Automated dependency management + +## Required Secrets + +No additional secrets are required - GitHub Actions uses built-in `GITHUB_TOKEN` for deployment. + +## Branch Strategy + +- **`publish`**: Production deployment branch (auto-deploys to GitHub Pages) +- **`main`/`master`**: Development branch (tests only) +- **Feature branches**: Pull request testing only \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..a9abfc8d7 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,59 @@ +version: 2 +updates: + # Enable version updates for npm + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + day: "sunday" + time: "02:00" + open-pull-requests-limit: 10 + reviewers: + - "MissingMaps/maintainers" + assignees: + - "dalekunce" + commit-message: + prefix: "deps" + prefix-development: "deps-dev" + include: "scope" + groups: + development-dependencies: + dependency-type: "development" + patterns: + - "*" + production-dependencies: + dependency-type: "production" + patterns: + - "*" + + # Enable version updates for bundler + - package-ecosystem: "bundler" + directory: "/" + schedule: + interval: "weekly" + day: "sunday" + time: "02:00" + open-pull-requests-limit: 5 + reviewers: + - "MissingMaps/maintainers" + assignees: + - "dalekunce" + commit-message: + prefix: "deps" + include: "scope" + + # Enable version updates for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "sunday" + time: "02:00" + open-pull-requests-limit: 5 + reviewers: + - "MissingMaps/maintainers" + assignees: + - "dalekunce" + commit-message: + prefix: "ci" + include: "scope" \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..53fc3e492 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,85 @@ +name: CI/CD Pipeline + +on: + push: + branches: [ main, master, publish ] + pull_request: + branches: [ main, master, publish ] + +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3.5' + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Lint JavaScript + run: npm run lint + + - name: Build site + run: npm run build + env: + JEKYLL_ENV: production + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: site-build + path: _site/ + retention-days: 1 + + # Deployment job for GitHub Pages + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + if: github.ref == 'refs/heads/publish' && github.event_name == 'push' + steps: + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: site-build + path: _site/ + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Upload to GitHub Pages + uses: actions/upload-pages-artifact@v3 + with: + path: _site/ + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.github/workflows/manual-deploy.yml b/.github/workflows/manual-deploy.yml new file mode 100644 index 000000000..ee47d7a4b --- /dev/null +++ b/.github/workflows/manual-deploy.yml @@ -0,0 +1,71 @@ +name: Manual Deploy + +on: + workflow_dispatch: + inputs: + environment: + description: 'Deployment environment' + required: true + default: 'staging' + type: choice + options: + - staging + - production + skip_tests: + description: 'Skip test suite' + required: false + default: false + type: boolean + +jobs: + deploy: + runs-on: ubuntu-latest + environment: ${{ github.event.inputs.environment }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3.5' + bundler-cache: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run tests + if: ${{ !inputs.skip_tests }} + run: npm test + + - name: Build for staging + if: ${{ inputs.environment == 'staging' }} + run: npm run build:dev + env: + JEKYLL_ENV: development + + - name: Build for production + if: ${{ inputs.environment == 'production' }} + run: npm run build + env: + JEKYLL_ENV: production + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: site-${{ inputs.environment }}-${{ github.sha }} + path: _site/ + retention-days: 7 + + - name: Deploy notification + run: | + echo "🚀 Deployment completed for ${{ inputs.environment }}" + echo "📦 Build artifacts uploaded" + echo "🔗 Commit: ${{ github.sha }}" \ No newline at end of file diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml new file mode 100644 index 000000000..832ce80d4 --- /dev/null +++ b/.github/workflows/security.yml @@ -0,0 +1,76 @@ +name: Security and Dependency Checks + +on: + schedule: + # Run weekly on Sundays at 2 AM UTC + - cron: '0 2 * * 0' + push: + branches: [ main, master ] + paths: + - 'package.json' + - 'package-lock.json' + - 'Gemfile' + - 'Gemfile.lock' + workflow_dispatch: # Allow manual trigger + +jobs: + security-audit: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Run npm security audit + run: npm audit --audit-level moderate + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3.5' + bundler-cache: true + + - name: Run Ruby security audit + run: | + gem install bundler-audit + bundle audit --update + + - name: Check for outdated dependencies + run: | + echo "=== NPM Outdated ===" + npm outdated || true + echo "=== Bundle Outdated ===" + bundle outdated || true + + lint-and-format: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint + + - name: Check code formatting + run: | + # Add any additional formatting checks here + echo "Code formatting check completed" \ No newline at end of file diff --git a/.github/workflows/test-multilingual.yml b/.github/workflows/test-multilingual.yml new file mode 100644 index 000000000..22ae41a01 --- /dev/null +++ b/.github/workflows/test-multilingual.yml @@ -0,0 +1,55 @@ +name: Jekyll Polyglot Multilingual Tests + +on: + push: + branches: [ main, modernize-2025 ] + pull_request: + branches: [ main ] + +jobs: + test-multilingual: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3.5' + bundler-cache: true + cache-version: 1 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.18.0' + cache: 'npm' + + - name: Install Node dependencies + run: npm ci + + - name: Verify Ruby and Bundle setup + run: | + ruby --version + bundle --version + bundle list + + - name: Run Jekyll build + run: bundle exec jekyll build --config _config.yml + + - name: Run multilingual tests + run: chmod +x ./test-multilingual.sh && ./test-multilingual.sh + + - name: Check for broken links (sample) + run: | + # Basic link verification for main pages + for lang in "" "fr/" "es/" "cs/"; do + echo "Checking ${lang:-en} pages..." + if [ -f "_site/${lang}about/index.html" ]; then + echo "✅ ${lang:-en}about page exists" + else + echo "❌ ${lang:-en}about page missing" + exit 1 + fi + done \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..0850a5014 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,59 @@ +name: Pull Request Tests + +on: + pull_request: + branches: [ main, master, publish ] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3.5' + bundler-cache: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Lint JavaScript + run: npm run lint + + - name: Test build process + run: npm run build + env: + JEKYLL_ENV: production + + - name: Check for build artifacts + run: | + if [ ! -d "_site" ]; then + echo "Build failed: _site directory not found" + exit 1 + fi + if [ ! -f "_site/index.html" ]; then + echo "Build failed: index.html not found" + exit 1 + fi + echo "Build successful!" + + - name: Run additional checks + run: | + # Check that main assets were built + if [ ! -f "_site/assets/scripts/main.min.js" ]; then + echo "Warning: main.min.js not found" + fi + if [ ! -d "_site/assets/styles" ]; then + echo "Warning: styles directory not found" + fi + echo "Asset checks completed" \ No newline at end of file diff --git a/.github/workflows/update-events.yml b/.github/workflows/update-events.yml new file mode 100644 index 000000000..535ce35de --- /dev/null +++ b/.github/workflows/update-events.yml @@ -0,0 +1,78 @@ +name: Update Events Data + +on: + # Run every 24 hours at 6 AM UTC + schedule: + - cron: '0 6 * * *' + + # Allow manual triggering + workflow_dispatch: + + # Run on push to specific files (for testing) + push: + paths: + - 'fetch-events.cjs' + - '.github/workflows/update-events.yml' + +jobs: + update-events: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm install --only=production + + - name: Fetch latest events + run: node fetch-events.cjs + + - name: Check for changes + id: verify-changed-files + run: | + if [ -n "$(git status --porcelain app/assets/data/events.json)" ]; then + echo "changed=true" >> $GITHUB_OUTPUT + echo "Events data has been updated" + else + echo "changed=false" >> $GITHUB_OUTPUT + echo "No changes to events data" + fi + + - name: Commit updated events + if: steps.verify-changed-files.outputs.changed == 'true' + run: | + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add app/assets/data/events.json + git commit -m "🤖 Auto-update events data from osmcal.org + + - Updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC') + - Events count: $(jq '.count' app/assets/data/events.json) + - Build time: $(jq -r '.buildTime' app/assets/data/events.json)" + + - name: Push changes + if: steps.verify-changed-files.outputs.changed == 'true' + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.ref }} + + - name: Summary + run: | + echo "## Events Update Summary" >> $GITHUB_STEP_SUMMARY + echo "- **Build Time:** $(jq -r '.buildTime' app/assets/data/events.json)" >> $GITHUB_STEP_SUMMARY + echo "- **Events Count:** $(jq '.count' app/assets/data/events.json)" >> $GITHUB_STEP_SUMMARY + echo "- **Changed:** ${{ steps.verify-changed-files.outputs.changed }}" >> $GITHUB_STEP_SUMMARY + if [ -f app/assets/data/events.json ]; then + echo "- **Event Names:**" >> $GITHUB_STEP_SUMMARY + jq -r '.events[].name' app/assets/data/events.json | head -10 | sed 's/^/ - /' >> $GITHUB_STEP_SUMMARY + fi \ No newline at end of file diff --git a/.gitignore b/.gitignore index 60254912e..ccadf198c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,8 +15,6 @@ app/assets/scripts/config/local.js app/_data/events app/_posts app/.jekyll-cache -app/assets/google-sheets/* -!app/assets/google-sheets/README.md #Foundation additions diff --git a/.nvmrc b/.nvmrc index 66df3b7ab..2a393af59 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -12.16.1 +20.18.0 diff --git a/.ruby-version b/.ruby-version index 338a5b5d8..fa7adc7ac 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.6 +3.3.5 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9dc0cbb56..000000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: ruby -rvm: - - 2.6.6 -env: - global: - - GH_REF=github.com/MissingMaps/missingmaps.github.io - - DEPLOY_BRANCH=publish - - secure: CWoizTEORW1cbd9e9wtebUIiTsztfRgS5wTRTTkRl1NJBbgK5KElLedcQxoIi3jU+rdkZCSyi5aNe6U4dAkUf1PvPlO2WCC6qOxZGdeuhXGY2SEQvpsW+VmTVa5IjE/EN2/X1Vpg5P092xEu7+n7W90d8EKlUaUIWXEPGz5S2fMIszdsDbs5SxZ5k4Bz1mMuB4Kr6w7sbVuEFIUaQII7vg63z6EjVu1CDpUoqc9nLYD+deScWLD9fCr5s1wxre36/tg4k52WvhiPddwFJAdpns3peTQxfR6Wgoc4oDch92lFG59zweDcBDRkbI/kG6yxc3m2BXges9GZztEh0c5BfenEXwqJI0gHA3cvuzcp86zTposQeaFOk3BaRzEULitBFyAP6OTIKp4oaS+fbXGGtzDgz47s4SAGwEJIOQHkRTbGCq/OlnkbPB2N+X+tMYXbeO9n4p3OGuLRgvpILx5GAO7sEUKp7cc4IfcoRdSCxbUWO/M7dcn1ZKK+Yc9rYcyaKlniimBchBOlCqTS9SZ9kxmko1pZKpvy18dPzrgkI2MVX7TKbms0ZjixV/9el7Ir/HIl+Sz3akJ7YZi8q1mQ56cTEiPg7ZC37XC5uxJylA4uwQy4jK3macvfmxwhXd+EZDxl6v0NreZNtmwhphPWIELabmR6/wrd4xhqNaup1Mk= -# cache: -# directories: -# - node_modules -before_install: - - chmod +x ./.build_scripts/deploy.sh -before_script: - - . $HOME/.nvm/nvm.sh - - nvm install $TRAVIS_NODE_VERSION - - nvm use $TRAVIS_NODE_VERSION - - npm install -g gulp - - gem install bundler -v 2.4.3 - - npm install -script: gulp prod -after_success: - - "./.build_scripts/deploy.sh" diff --git a/Gemfile b/Gemfile index 5bf7eb029..f4a0c4d02 100644 --- a/Gemfile +++ b/Gemfile @@ -1,8 +1,24 @@ source "https://rubygems.org" -gem "jekyll", "~> 4.0" -# gem 'sass', '~>3.4.21' -# gem 'sass-css-importer', '~>1.0.0.beta.0' -# gem "i18n", "0.7.0" -gem 'jekyll-feed' -gem 'jekyll-sitemap' \ No newline at end of file +# Use Ruby 3.3+ +ruby ">= 3.3.0" + +# Jekyll +gem "jekyll", "~> 4.3.4" + +# Jekyll plugins +gem "jekyll-feed", "~> 0.17" +gem "jekyll-sitemap", "~> 1.4" +gem "jekyll-polyglot", "~> 1.8" + +# Additional gems for security and performance +gem "webrick", "~> 1.8" # Required for Ruby 3.0+ +gem "csv", "~> 3.3" # Required for Ruby 3.4+ +gem "base64", "~> 0.2" # Required for Ruby 3.4+ +gem "logger", "~> 1.6" # Will be removed from stdlib in Ruby 3.5 +gem "ostruct", "~> 0.6" # Will be removed from stdlib in Ruby 3.5 + +# Development dependencies +group :development do + gem "bundler", "~> 2.5" +end \ No newline at end of file diff --git a/Gemfile 2.lock b/Gemfile 2.lock new file mode 100644 index 000000000..035762407 --- /dev/null +++ b/Gemfile 2.lock @@ -0,0 +1,73 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + colorator (1.1.0) + concurrent-ruby (1.1.6) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7) + ffi (1.12.2) + forwardable-extended (2.6.0) + http_parser.rb (0.6.0) + i18n (1.8.2) + concurrent-ruby (~> 1.0) + jekyll (4.0.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (>= 0.9.5, < 2) + jekyll-sass-converter (~> 2.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (~> 3.0) + safe_yaml (~> 1.0) + terminal-table (~> 1.8) + jekyll-feed (0.13.0) + jekyll (>= 3.7, < 5.0) + jekyll-sass-converter (2.1.0) + sassc (> 2.0.1, < 3.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.3) + rb-fsevent (0.10.3) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.17.0) + safe_yaml (1.0.5) + sassc (2.2.1) + ffi (~> 1.9) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + unicode-display_width (1.7.0) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll (~> 4.0) + jekyll-feed + jekyll-sitemap + +BUNDLED WITH + 2.1.4 diff --git a/Gemfile.lock b/Gemfile.lock index 035762407..66dbd2193 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,73 +1,111 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + base64 (0.3.0) + bigdecimal (3.2.3) colorator (1.1.0) - concurrent-ruby (1.1.6) - em-websocket (0.5.1) + concurrent-ruby (1.3.5) + csv (3.3.5) + em-websocket (0.5.3) eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) + http_parser.rb (~> 0) eventmachine (1.2.7) - ffi (1.12.2) + ffi (1.17.2) + ffi (1.17.2-arm64-darwin) + ffi (1.17.2-x86_64-darwin) forwardable-extended (2.6.0) - http_parser.rb (0.6.0) - i18n (1.8.2) + google-protobuf (4.32.1) + bigdecimal + rake (>= 13) + google-protobuf (4.32.1-arm64-darwin) + bigdecimal + rake (>= 13) + google-protobuf (4.32.1-x86_64-darwin) + bigdecimal + rake (>= 13) + http_parser.rb (0.8.0) + i18n (1.14.7) concurrent-ruby (~> 1.0) - jekyll (4.0.0) + jekyll (4.3.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) - i18n (>= 0.9.5, < 2) - jekyll-sass-converter (~> 2.0) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) jekyll-watch (~> 2.0) - kramdown (~> 2.1) + kramdown (~> 2.3, >= 2.3.1) kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (~> 0.3.3) + mercenary (>= 0.3.6, < 0.5) pathutil (~> 0.9) - rouge (~> 3.0) + rouge (>= 3.0, < 5.0) safe_yaml (~> 1.0) - terminal-table (~> 1.8) - jekyll-feed (0.13.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) - jekyll-sass-converter (2.1.0) - sassc (> 2.0.1, < 3.0) + jekyll-polyglot (1.11.0) + jekyll (>= 4.0, >= 3.0) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - kramdown (2.3.1) - rexml + kramdown (2.5.1) + rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.2.1) + liquid (4.0.4) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) + logger (1.7.0) + mercenary (0.4.0) + ostruct (0.6.3) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (4.0.3) - rb-fsevent (0.10.3) - rb-inotify (0.10.1) + public_suffix (6.0.2) + rake (13.3.0) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.5) - rouge (3.17.0) + rexml (3.4.4) + rouge (4.6.1) safe_yaml (1.0.5) - sassc (2.2.1) - ffi (~> 1.9) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - unicode-display_width (1.7.0) + sass-embedded (1.93.2) + google-protobuf (~> 4.31) + rake (>= 13) + sass-embedded (1.93.2-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-darwin) + google-protobuf (~> 4.31) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.6.0) + webrick (1.9.1) PLATFORMS + arm64-darwin ruby + x86_64-darwin DEPENDENCIES - jekyll (~> 4.0) - jekyll-feed - jekyll-sitemap + base64 (~> 0.2) + bundler (~> 2.5) + csv (~> 3.3) + jekyll (~> 4.3.4) + jekyll-feed (~> 0.17) + jekyll-polyglot (~> 1.8) + jekyll-sitemap (~> 1.4) + logger (~> 1.6) + ostruct (~> 0.6) + webrick (~> 1.8) + +RUBY VERSION + ruby 3.3.5p100 BUNDLED WITH - 2.1.4 + 2.6.9 diff --git a/INTERNATIONALIZATION.md b/INTERNATIONALIZATION.md new file mode 100644 index 000000000..73d607d16 --- /dev/null +++ b/INTERNATIONALIZATION.md @@ -0,0 +1,264 @@ +# Missing Maps Jekyll Polyglot Internationalization System + +## Overview + +This document describes the modernized internationalization (i18n) system for the Missing Maps website, which uses Jekyll Polyglot to support multiple languages efficiently. + +## Architecture + +### Before (Legacy System) +- **65+ duplicate HTML files** across 4 language directories (`/en/`, `/fr/`, `/es/`, `/cs/`) +- Manual URL parsing for locale detection +- Maintenance nightmare with code duplication + +### After (Jekyll Polyglot System) +- **13 centralized templates** in `/app/` root directory +- **Automatic language generation** by Jekyll Polyglot plugin +- **Single source of truth** for page structure +- **Data-driven translations** via `_data/{lang}.yml` files + +## Languages Supported + +| Language | Code | URL Pattern | Data File | +|----------|------|-------------|-----------| +| English | `en` | `/` (root) | `_data/en.yml` | +| French | `fr` | `/fr/` | `_data/fr.yml` | +| Spanish | `es` | `/es/` | `_data/es.yml` | +| Czech | `cs` | `/cs/` | `_data/cs.yml` | + +## Key Components + +### 1. Configuration (_config.yml) + +```yaml +# Jekyll Polyglot Configuration +languages: ["en", "fr", "cs", "es"] +default_lang: "en" +exclude_from_localization: ["assets", "scripts", "styles", "images", "favicon.ico", "robots.txt", "humans.txt", "CNAME", "Process-1.svg"] +parallel_localization: true + +plugins: + - jekyll-polyglot +``` + +### 2. Page Templates + +All page templates are located in `/app/` root: +- `index.html` - Homepage +- `about.html` - About page +- `advanced.html` - Advanced tutorials +- `beginner.html` - Beginner tutorials +- `blog.html` - Blog listing +- `categories.html` - Category view +- `events.html` - Events page +- `field.html` - Field mapping +- `host.html` - Host page +- `mapswipe.html` - MapSwipe +- `statistics.html` - Statistics +- `tags.html` - Tag view +- `validate.html` - Validation + +### 3. Locale Detection + +The `_includes/get_locale.html` include sets the locale variable: + +```liquid +{% assign locale = site.active_lang %} +``` + +### 4. Translation Data + +Translations are stored in YAML files under `_data/`: + +**Structure Example (`_data/en.yml`):** +```yaml +about: + title: "About" + who_we_are: + title: "Who we are" + text1: "Missing Maps is a project..." + objectives: + title: "Objectives" + text1: "To map areas where people live..." +``` + +**Usage in Templates:** +```liquid +

{{site.data[locale].about.title}}

+

{{site.data[locale].about.who_we_are.text1}}

+``` + +### 5. Language Switcher + +Updated to work with Jekyll Polyglot in `_includes/header.html`: + +```liquid +{% for lang in site.languages %} + {% if lang == site.default_lang %} + + + + {% else %} + + + + {% endif %} +{% endfor %} +``` + +## Build Process + +### Development +```bash +npm run serve +# Builds site with Jekyll Polyglot and starts development server +``` + +### Production Build +```bash +npm run build +# Optimized build with SASS compression and asset optimization +``` + +### Testing +```bash +./test-multilingual.sh +# Runs comprehensive multilingual functionality tests +``` + +## Generated Output + +Jekyll Polyglot automatically generates: + +``` +_site/ +├── index.html # English homepage +├── about/ # English about page +├── assets/ # Shared assets +├── fr/ +│ ├── index.html # French homepage +│ ├── about/ # French about page +│ └── feed.xml # French RSS feed +├── es/ +│ ├── index.html # Spanish homepage +│ ├── about/ # Spanish about page +│ └── feed.xml # Spanish RSS feed +└── cs/ + ├── index.html # Czech homepage + ├── about/ # Czech about page + └── feed.xml # Czech RSS feed +``` + +## Performance Optimizations + +### Jekyll Configuration +- **Incremental builds**: `incremental: true` +- **SASS compression**: `style: compressed` +- **Parallel localization**: `parallel_localization: true` +- **Liquid optimization**: `strict_filters: true` + +### Build Exclusions +- `node_modules/` +- `package.json` +- `gulpfile.cjs` +- `.sass-cache/` +- `.jekyll-cache/` + +## Adding New Languages + +1. **Add language code** to `_config.yml`: + ```yaml + languages: ["en", "fr", "cs", "es", "de"] # Added German + ``` + +2. **Create translation file** `_data/de.yml`: + ```yaml + about: + title: "Über uns" + # ... translations + ``` + +3. **Rebuild site**: Jekyll Polyglot will automatically generate `/de/` routes + +## Adding New Pages + +1. **Create template** in `/app/`: + ```html + --- + layout: default + permalink: /newpage/ + id: newpage + --- + {% include get_locale.html %} + {% include header.html %} +

{{site.data[locale].newpage.title}}

+ ``` + +2. **Add translations** to all `_data/{lang}.yml` files: + ```yaml + newpage: + title: "New Page Title" + ``` + +## Troubleshooting + +### Common Issues + +**Language pages not generating:** +- Check `languages` array in `_config.yml` +- Ensure page templates are in `/app/` root, not subdirectories +- Verify `jekyll-polyglot` plugin is installed and listed + +**Translations not showing:** +- Check `locale` variable is set via `{% include get_locale.html %}` +- Verify translation keys exist in `_data/{lang}.yml` +- Ensure correct Liquid syntax: `{{site.data[locale].key}}` + +**Build errors:** +- Run `bundle exec jekyll build --trace` for detailed error info +- Check for YAML syntax errors in `_data/` files +- Verify all required translations exist for each language + +### Debugging Commands + +```bash +# Full build with error details +bundle exec jekyll build --trace + +# Test translations +./test-multilingual.sh + +# Check generated structure +ls -la _site/*/ + +# Verify specific language content +grep "feature-header" _site/fr/about/index.html +``` + +## Migration from Legacy System + +The migration eliminated: +- **52 duplicate English files** (moved to templates) +- **4 language directories** (auto-generated now) +- **Old locale detection logic** (replaced with Polyglot) +- **Manual URL construction** (handled by plugin) + +### Benefits Achieved +- 🚀 **80% reduction in code duplication** +- 🔧 **Simplified maintenance** (single templates) +- 🌐 **Consistent translation system** +- ⚡ **Improved build performance** +- 🧪 **Automated testing coverage** + +## Support & Maintenance + +For issues or questions: +1. Check this documentation +2. Run test suite: `./test-multilingual.sh` +3. Review Jekyll Polyglot docs: https://github.com/untra/polyglot +4. Check build logs for specific errors + +--- + +*Last updated: October 2025* +*System version: Jekyll Polyglot v1.11.0* \ No newline at end of file diff --git a/QUICK-REFERENCE.md b/QUICK-REFERENCE.md new file mode 100644 index 000000000..1ec20b988 --- /dev/null +++ b/QUICK-REFERENCE.md @@ -0,0 +1,90 @@ +# Quick Reference: Jekyll Polyglot System + +## Essential Commands + +```bash +# Development +npm run serve # Start development server +./test-multilingual.sh # Run tests +bundle exec jekyll build # Manual build + +# Adding translations +# 1. Edit _data/{lang}.yml files +# 2. Use {{site.data[locale].key}} in templates +# 3. Rebuild automatically detects changes +``` + +## File Structure + +``` +app/ +├── _data/ +│ ├── en.yml # English translations +│ ├── fr.yml # French translations +│ ├── es.yml # Spanish translations +│ └── cs.yml # Czech translations +├── _includes/ +│ ├── get_locale.html # Sets locale variable +│ └── header.html # Language switcher +├── index.html # Homepage template +├── about.html # About page template +└── *.html # Other page templates +``` + +## Language URLs + +- English: `/` (root) +- French: `/fr/` +- Spanish: `/es/` +- Czech: `/cs/` + +## Translation Syntax + +```liquid + +{% include get_locale.html %} + + +

{{site.data[locale].section.title}}

+

{{site.data[locale].section.text}}

+``` + +## Quick Tests + +```bash +# Verify all languages work +for lang in "" "fr/" "es/" "cs/"; do + echo "${lang:-en}: $(grep 'feature-header' _site/${lang}about/index.html)" +done + +# Check feed generation +ls _site/*/feed.xml _site/feed.xml +``` + +## Adding New Content + +1. **New page**: Create `newpage.html` in `/app/` +2. **Add translations**: Update all `_data/{lang}.yml` files +3. **Test**: Run `./test-multilingual.sh` + +## Common Patterns + +```yaml +# _data/en.yml structure +section: + title: "Section Title" + text: "Section content" + subsection: + item1: "First item" + item2: "Second item" +``` + +```liquid + +

{{site.data[locale].section.title}}

+

{{site.data[locale].section.text}}

+ +``` \ No newline at end of file diff --git a/README.md b/README.md index 1fe3cfbbe..220504068 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,14 @@ ## [Missing Maps](http://www.missingmaps.org/) +### 📚 Documentation + +- **[Quick Reference](./QUICK-REFERENCE.md)** - Essential commands and patterns for developers +- **[Internationalization Guide](./INTERNATIONALIZATION.md)** - Complete multilingual system documentation +- **[Test Suite](./test-multilingual.sh)** - Automated testing for multilingual functionality + ### Adding events -Events are managed through a Google Form and Sheet. +Events have been deprecated and no longer show on the site. ### Adding Blog Post @@ -14,26 +20,46 @@ During the regularly occurring site build process, any files in the `app/assets/ ### Adding Language support -The site is configured to support 2-letter core language codes. So english is 'en' not 'en-US' and/or 'en-GB'. Using a longer code will not function. - -There are four main steps in incorporating a language: - -1. tell app config the language exists - 1. add 2-letter language code to ```authorized_locales``` array in \_config.yml -2. include locale file (to support date/time localization) - 1. several already in place (in \_locales dir), otherwise get from [here](https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale) -3. include \_data/```2-letter code```.yml to support site content translations - 1. copy \_data/en.yml, then update text values - 2. note that the url for the nav items can be updates for your language. this needs to align with the permalink in the page frontmatter (see item 4.2 below) -4. create folder of page templates - 1. copy 'en' dir, rename copy as your 2-letter language code - 2. in frontmatter for all templates there within, you need to add the language code and pagename to the ```permalink``` (i.e. /about/ becomes /fr/apropos/ for the french translation) -5. create folder of blog posts - 1. copy the \_posts/en dir, rename folder as your 2-letter language code - 2. in frontmatter for all templates there within, you need to change the ```language``` to the correct code and add the language code to the ```permalink``` (i.e. /blog/:year/:month/:day/:title/ becomes /fr/blog/:year/:month/:day/:title/ for the french translation) -6. (OPTIONAL) Add translations of pdf assets - 1. add documents to assets/downloads - 2. update \_data/```2-letter code```.yml host.materials_list.asset(s) with the filename you created +** The site uses Jekyll Polyglot for modern internationalization!** + +📚 **Quick Start**: See [QUICK-REFERENCE.md](./QUICK-REFERENCE.md) for essential commands and syntax + +📖 **Complete Guide**: See [INTERNATIONALIZATION.md](./INTERNATIONALIZATION.md) for full documentation + +#### Current Languages Supported +- **English** (`en`) - `/` (root) +- **French** (`fr`) - `/fr/` +- **Spanish** (`es`) - `/es/` +- **Czech** (`cs`) - `/cs/` + +#### Modern Architecture (Jekyll Polyglot) +The site now uses a **single set of templates** with **automatic language generation**: + +- ✅ **13 centralized templates** (instead of 65+ duplicate files) +- ✅ **Automatic URL generation** for all languages +- ✅ **Data-driven translations** via `_data/{lang}.yml` files +- ✅ **Testing suite** for multilingual functionality + +#### Quick Language Addition +1. **Add language code** to `_config.yml`: + ```yaml + languages: ["en", "fr", "cs", "es", "de"] + ``` + +2. **Create translation file** `_data/de.yml`: + ```yaml + about: + title: "Über uns" + # ... copy structure from _data/en.yml + ``` + +3. **Test**: Run `./test-multilingual.sh` to verify + +#### Testing Multilingual Functionality +```bash +./test-multilingual.sh # Run comprehensive tests +npm run serve # Start development server +``` If the Jeykll build is failing when parsing one of the `/app/_data/*.yml` files, it can be useful to install and use [`yamllint`](https://yamllint.readthedocs.io/en/stable/). Running, for example, `yamllint ./app/_data/fr.yml` will output a large number of errors but you can find the critical ones base on the description, such as: ``` @@ -45,51 +71,147 @@ If the Jeykll build is failing when parsing one of the `/app/_data/*.yml` files, ### Environment To set up the development environment for this website, you'll need to install the following on your system: -- [Node and npm](http://nodejs.org/) (version in `.nvmrc` file) -- Ruby and [Bundler](http://bundler.io/), preferably through something like [rvm](https://rvm.io/) (version in `.ruby-version` file) -- Gulp -``` -$ gem install bundler -v 2.4.3 -$ npm install -g gulp -$ npm install --global gulp-cli +- **Node.js and npm** (version 20+ LTS - see `.nvmrc` file) +- **Ruby** (version 3.3+ - see `.ruby-version` file) and [Bundler](http://bundler.io/) + - Recommended: Install via [rbenv](https://github.com/rbenv/rbenv) or [rvm](https://rvm.io/) + +**Global dependencies:** +```bash +$ gem install bundler +$ npm install -g gulp-cli # Optional - npm scripts work without global gulp ``` -After these basic requirements are met, run the following commands in the website's folder: + +**Project setup:** +```bash +$ npm install # Installs Node.js dependencies and automatically runs bundle install +$ bundle install # Installs Ruby gems (if not already run by npm install) ``` -$ npm install + +**Version managers (recommended):** +```bash +# For Node.js version management +$ nvm use # Uses version specified in .nvmrc + +# For Ruby version management +$ rbenv install # Installs version specified in .ruby-version +$ rbenv shell # Activates the correct Ruby version ``` -Will also run `bundle install` -If you get a `jekyll-4.0.0 requires rubygems version >= 2.7.0, which is incompatible with the current version` error then try running: `gem update --system` +If you encounter a `jekyll-4.0.0 requires rubygems version >= 2.7.0` error, try: `gem update --system` ### Getting started +To build and serve the site locally with all assets: + +```bash +$ npm run serve ``` -$ gulp serve -``` -Compiles the compass files, javascripts, and launches the server making the site available at `http://localhost:3000/` -The system will watch files and execute tasks whenever one of them changes. -The site will automatically refresh since it is bundled with livereload. -The `_config-dev.yml` file will be loaded alongside `_config.yml`. +This command will: +1. **Clean** previous builds +2. **Clone blog posts** from the blog repository +3. **Fetch events** data and helpers +4. **Build Jekyll** site with both `_config.yml` and `_config-dev.yml` +5. **Compile JavaScript** and process all scripts +6. **Process CSS/Styles** with modern dependencies +7. **Generate icons** and optimize images +8. **Create downloadable materials** (zip files) +9. **Copy assets** to the build directory +10. **Start Browsersync** server with file watching -### Other commands -Clean the compiled site. I.e. the `_site` folder -``` -$ gulp clean -``` +The site will be available at: +- **Primary (Browsersync)**: `http://localhost:3000` - *Recommended for development* +- **Browsersync UI**: `http://localhost:3001` - Controls and sync options +- **Jekyll only**: `http://127.0.0.1:4000` - Basic Jekyll server + +The system automatically watches files and rebuilds when changes are detected. The site will auto-refresh in your browser. + +### Manual asset building + +If you need to run specific build steps manually: -Compile the compass files, javascripts, and builds the jekyll site using `_config-dev.yml`. -Use this instead of ```gulp serve``` if you don't want to watch. +**Build all assets for production:** +```bash +$ npm run build +# Equivalent to: gulp prod ``` -$ gulp + +**Clean compiled assets:** +```bash +$ npm run clean +# Equivalent to: gulp clean ``` -Compiles the site loading the `_config-stage.yml` alongside `_config.yml`. The javascript files will be minified. +**Development build (same as serve but without server):** +```bash +$ npm run build:dev +# Equivalent to: gulp serve (without server) ``` -$ gulp stage + +### Code quality and testing + +**Run full test suite:** +```bash +$ npm test +# Runs linting + production build to verify everything works ``` -Compiles the site loading the `_config-prod.yml` alongside `_config.yml`. The javascript files will be minified. +**Test multilingual functionality:** +```bash +$ ./test-multilingual.sh +# Comprehensive tests for Jekyll Polyglot system: +# - Build verification +# - Language directory structure +# - Translation content verification +# - Feed generation verification +# - Asset exclusion verification +# - Polyglot configuration validation ``` -$ gulp prod + +**Lint JavaScript code:** +```bash +$ npm run lint # Check for issues +$ npm run lint:fix # Auto-fix issues where possible ``` + +### Troubleshooting + +**Assets not loading properly:** +- Make sure you ran `npm run serve` (not just Jekyll) +- Check that both Gulp and Jekyll servers are running +- Use `http://localhost:3000` (Browsersync) instead of `http://127.0.0.1:4000` (Jekyll only) + +**Build failures:** +- Try `npm run clean` then `npm run serve` to start fresh +- Ensure Node.js 20+ and Ruby 3.3+ are installed +- Check that all dependencies are up to date: `npm install && bundle install` + +**Jekyll warnings about missing gems:** +- Run `bundle install` to ensure all Ruby gems are installed +- Check `.ruby-version` and use the correct Ruby version + +## CI/CD + +### GitHub Actions +This project uses GitHub Actions for continuous integration and deployment, replacing the previous Travis CI setup. + +**Workflows:** +- **CI/CD Pipeline** (`.github/workflows/deploy.yml`): Builds and deploys to GitHub Pages on `publish` branch +- **Pull Request Tests** (`.github/workflows/test.yml`): Runs tests on all PRs +- **Multilingual Tests** (`.github/workflows/test-multilingual.yml`): Tests Jekyll Polyglot functionality +- **Security Checks** (`.github/workflows/security.yml`): Weekly security and dependency audits +- **Manual Deploy** (`.github/workflows/manual-deploy.yml`): On-demand deployments + +**Automated Dependency Updates:** +- Dependabot is configured to automatically update npm, Ruby gems, and GitHub Actions +- Updates are scheduled weekly and automatically assigned to maintainers + +**Deployment:** +- **Production**: Push to `publish` branch automatically deploys to GitHub Pages +- **Testing**: All PRs are automatically built and tested +- **Security**: Weekly scans for vulnerabilities and outdated dependencies + +### Branch Strategy +- `publish`: Production deployment branch (auto-deploys to missingmaps.org) +- `main`/`master`: Main development branch +- Feature branches: Create PRs for review and testing diff --git a/_config-performance.yml b/_config-performance.yml new file mode 100644 index 000000000..dbd1e054c --- /dev/null +++ b/_config-performance.yml @@ -0,0 +1,21 @@ +# Jekyll cache optimization +# Place in .jekyll-cache for faster builds +cache_dir: .jekyll-cache + +# Optimize Jekyll performance +incremental: true +profile: false + +# Liquid template optimization +liquid: + error_mode: strict + strict_filters: true + strict_variables: false + +# SASS compression +sass: + style: compressed + sourcemap: never + +# Polyglot optimization +parallel_localization: true \ No newline at end of file diff --git a/_config.yml b/_config.yml index c777cfd6a..b5ec0809e 100644 --- a/_config.yml +++ b/_config.yml @@ -8,22 +8,45 @@ exclude: - assets/styles - README.md - assets/sources + - node_modules + - package.json + - package-lock.json + - gulpfile.cjs + - .sass-cache + - .jekyll-cache + - vendor timezone: America/New_York highlighter: false encoding: UTF-8 +# Performance optimizations +incremental: true +profile: false +strict_front_matter: true + +# Caching and build optimization +sass: + style: compressed + sourcemap: never + +# Liquid rendering optimization +liquid: + error_mode: strict + strict_filters: true + strict_variables: false + baseurl: "" permalink: pretty -collections: - - events - -# locale settings -default_locale: "en" -authorized_locales: ["cs", "en", "es", "fr"] +# Jekyll Polyglot Configuration +languages: ["en", "fr", "cs", "es"] +default_lang: "en" +exclude_from_localization: ["assets", "scripts", "styles", "images", "favicon.ico", "robots.txt", "humans.txt", "CNAME", "Process-1.svg", "_site", "node_modules"] +parallel_localization: true # add support for an atom feed and sitemap plugins: - jekyll-feed - jekyll-sitemap + - jekyll-polyglot diff --git a/app/.jekyll-metadata b/app/.jekyll-metadata new file mode 100644 index 000000000..275e0fb35 Binary files /dev/null and b/app/.jekyll-metadata differ diff --git a/app/_data/cs.yml b/app/_data/cs.yml index 30c726c6f..d63bfe1ae 100644 --- a/app/_data/cs.yml +++ b/app/_data/cs.yml @@ -4,46 +4,46 @@ img-alt: wright-stuff: "..." arrow: "..." - blog: "..." - Edit: "..." - Changeset: "..." - Building: "..." - fieldmapping1: "Group of volunteers conduct surveys in the street" - fieldmapping2: "MSF personnel host community meeting" - Road: "..." - MM-White: "..." - mapswipe-before: "..." - mapswipe-after: "..." - mapswipe-squares: "..." - mapswipe-footer: "..." - MapNow: "Je zobrazen kreslený notebook. Obrazovka notebooku zobrazuje dvě kreslené postavy s mapovými komponenty v životní velikosti. Muž umisťuje ohraničení okolo struktury, zatímco žena běží směrem k muži a drží v rukou ikonu bodu zájmu (PointOfInterest, POI)." - Mapathon: "Různorodá skupina pěti kreslených postav je na mapathonu. Čtyří sedí u počítačů a jeden na ně dohlíží a jí přitom pizzu." - Donate: "Kreslené postavy muže a ženy si potřásají rukama a usmívají se." - Checklist: "Obrázek checklistu (seznamu úkolů) na tabuli se čtyřmi úkoly. Dva z nich jsou již odškrtnuté. Na obrázku je také prodlužovačka, tužka a ikona Twitteru." - Checklist-2: "Obrázek checklistu (seznamu úkolů) se čtyřmi úkoly. Tři z nich jsou již odškrtnuté. Na obrázku je také tužka." - Checklist-3: "A cartoon clipboard with the missing maps logo at the top and a download symbol." - LeaderboardGraphic: "Dva grafy: jeden modrý a druhý zelený. Neobsahují žádná data." - Learn-MapNow: "Kreslený počítač s logem OSM. Logo OSM je lupa nad mapou." - Learn-Tutorials: "Kreslený počítač s logem LearnOSM. Logo LearnOSM je lupa nad zelenou obdélníkovou mapou." - Learn-YouTube: "Kreslený počítač s logem YouTube. Logo YouTube je červený čtverec s bílým trojúhelníkovým symbolem pro přehrání." - MMlogo-Outlined: "Logo Missing Maps je šedé kolečko vyplněné různobarevnými obdélníky." - Process(outlined-text): "Obrázek skládající se ze tří částí. V první části jsou dvě kreslené postavy u počítačů na modrém pozadí. U nich je kousek pizzy. Text říká 'Jak pracujeme: Krok 1. Vzdálení dobrovolníci překreslují satelitní snímky do OpenStreetMapy.'. Ve druhé části je jedna kreslená postava držící počítač a pohybující se mezi dvěma stavbami. Pozadí je zelené. Stavba vlevo je budova se špičatou střechou. Stavba vpravo je budova s kulatou střechou ve tvaru houby. Text říká 'Krok 2. Dobrovolníci z místních komunit přidají místní detaily jako čtvrtě, názvy ulic a evakuační centra.'. Ve třetí části jsou tři kreslené postavy na oranžovém pozadí. Prostřední postava má ruce kolem ramen postav vedle něj. Na košili má logo Červeného Kříže. V pozadí jsou dvě ikony budov. Text říká 'Krok tři. Humanitární organizace použijí výsledky mapování při plánování činností pro snížení rizika a při reakci na katastrofy, aby zachránily životy." - Process-PartOne: "Dvě kreslené postavy u počítačů na modrém pozadí. U nich je kousek pizzy. Text říká 'Jak pracujeme: Krok 1. Vzdálení dobrovolníci překreslují satelitní snímky do OpenStreetMapy.'" - Process-PartTwo: "Jedna kreslená postava držící počítač a pohybující se mezi dvěma stavbami. Pozadí je zelené. Stavba vlevo je budova se špičatou střechou. Stavba vpravo je budova s kulatou střechou ve tvaru houby. Text říká 'Krok 2. Dobrovolníci z místní komunity přidají místní detaily jako čtvrtě, názvy ulic a evakuační centra.'" - Process-PartThree: "Tři kreslené postavy na oranžovém pozadí. Prostřední postava má ruce kolem ramen postav vedle něj. Na své košili má logo Červeného Kříže. V pozadí jsou dvě ikony budov. Text říká 'Krok tři. Humanitární organizace použijí výsledky mapování při plánování činností pro snížení rizika a při reakci na katastrofy, aby zachránily životy.'" - ProfileGraphic: "Kreslený obrázek počítačové plochy ukazuje rozložení uživatelského profilu. Hlavní orientační panel je šedý, a je zde napodobenina profilového obrázku s šedou kreslenou postavou s malým logem Missing Maps na hrudi." - SatelliteOfLove: "Kreslený obrázek satelitu. Je oranžový a ukazuje dolů." - Stars: "Obrázek je prázdný." - helper: "Napodobenina profilového obrázku s šedou kreslenou postavou s malým logem Missing Maps na hrudi." - 404: "Man in Red vest with 'Liberian Red Cross' logo points accorss a river." - mapathon: "Muž v červené vestě s logem Liberijského červeného kříže ukazuje přes řeku." - mapathon2: "Dvě ženy se usmívají, zatímco si užívají dobrovolničení a dívají se na počítač. " - mapathon3: "Učebna vybavená množstvím stolů. Za každým jsou mappeři s počítači a nápoji." - mapathon4: "Tři muži zkoumají mapu na zdi. Jeden ukazuje perem." - mapathon5: "Muž v košili vede dobrovolnické setkání. Lidé sledují projekci za ním." - mapathon6: "Lidé se shromažďují v krytém otevřeném prostoru, poslouchají a sledují ženu v triku s Červeným křížem. Žena má telefon, se kterým nahrává informace." - process: "Paprsky žlutého satelitu vysílají dolů na Zem. Nalevo, pod nápisem 'Krok 1: Vzdálení dobrovolníci trasují satelitní snímky do OpenStreetMap', sedí u stolu s počítači dvě modré postavy. Pod paprsky jsou na zemském povrchu tři kulaté chýše s textem nad sebou. Text uvádí 'Krok 2: Místní dobrovolníci přidávají detaily jako čtvrti, názvy ulic a evakuační centra.' Napravo skupina tří červených postav. Prostřední z nich má znak červeného kříže na hrudi. Text nad nimi říká ' Krok 3: Humanitární organizace využívají zmapované informace k plánování snižování rizik a odpovídající reakce na katastrofu, které zachraňují životy.'" - validate: "Close up of a desk, five computers are open to mapping. We see a map of the world and a printout of mapping instructions. A hand is on the keypad of the computer." +blog: "..." +Edit: "..." +Changeset: "..." +Building: "..." +fieldmapping1: "Group of volunteers conduct surveys in the street" +fieldmapping2: "MSF personnel host community meeting" +Road: "..." +MM-White: "..." +mapswipe-before: "..." +mapswipe-after: "..." +mapswipe-squares: "..." +mapswipe-footer: "..." +MapNow: "Je zobrazen kreslený notebook. Obrazovka notebooku zobrazuje dvě kreslené postavy s mapovými komponenty v životní velikosti. Muž umisťuje ohraničení okolo struktury, zatímco žena běží směrem k muži a drží v rukou ikonu bodu zájmu (PointOfInterest, POI)." +Mapathon: "Různorodá skupina pěti kreslených postav je na mapathonu. Čtyří sedí u počítačů a jeden na ně dohlíží a jí přitom pizzu." +Donate: "Kreslené postavy muže a ženy si potřásají rukama a usmívají se." +Checklist: "Obrázek checklistu (seznamu úkolů) na tabuli se čtyřmi úkoly. Dva z nich jsou již odškrtnuté. Na obrázku je také prodlužovačka, tužka a ikona Twitteru." +Checklist-2: "Obrázek checklistu (seznamu úkolů) se čtyřmi úkoly. Tři z nich jsou již odškrtnuté. Na obrázku je také tužka." +Checklist-3: "A cartoon clipboard with the missing maps logo at the top and a download symbol." +LeaderboardGraphic: "Dva grafy: jeden modrý a druhý zelený. Neobsahují žádná data." +Learn-MapNow: "Kreslený počítač s logem OSM. Logo OSM je lupa nad mapou." +Learn-Tutorials: "Kreslený počítač s logem LearnOSM. Logo LearnOSM je lupa nad zelenou obdélníkovou mapou." +Learn-YouTube: "Kreslený počítač s logem YouTube. Logo YouTube je červený čtverec s bílým trojúhelníkovým symbolem pro přehrání." +MMlogo-Outlined: "Logo Missing Maps je šedé kolečko vyplněné různobarevnými obdélníky." +Process(outlined-text): "Obrázek skládající se ze tří částí. V první části jsou dvě kreslené postavy u počítačů na modrém pozadí. U nich je kousek pizzy. Text říká 'Jak pracujeme: Krok 1. Vzdálené dobrovolníci překreslují satelitní snímky do OpenStreetMapy.'. Ve druhé části je jedna kreslená postava držící počítač a pohybující se mezi dvěma stavbami. Pozadí je zelené. Stavba vlevo je budova se špičatou střechou. Stavba vpravo je budova s kulatou střechou ve tvaru houby. Text říká 'Krok 2. Dobrovolníci z místních komunit přidají místní detaily jako čtvrtě, názvy ulic a evakuační centra.'. Ve třetí části jsou tři kreslené postavy na oranžovém pozadí. Prostřední postava má ruce kolem ramen postav vedle něj. Na košili má logo Červeného Kříže. V pozadí jsou dvě ikony budov. Text říká 'Krok tři. Humanitární organizace použijí výsledky mapování při plánování činností pro snížení rizika a při reakci na katastrofy, aby zachránily životy." +Process-PartOne: "Dvě kreslené postavy u počítačů na modrém pozadí. U nich je kousek pizzy. Text říká 'Jak pracujeme: Krok 1. Vzdálené dobrovolníci překreslují satelitní snímky do OpenStreetMapy.'" +Process-PartTwo: "Jedna kreslená postava držící počítač a pohybující se mezi dvěma stavbami. Pozadí je zelené. Stavba vlevo je budova se špičatou střechou. Stavba vpravo je budova s kulatou střechou ve tvaru houby. Text říká 'Krok 2. Dobrovolníci z místní komunity přidají místní detaily jako čtvrtě, názvy ulic a evakuační centra.'" +Process-PartThree: "Tři kreslené postavy na oranžovém pozadí. Prostřední postava má ruce kolem ramen postav vedle něj. Na své košili má logo Červeného Kříže. V pozadí jsou dvě ikony budov. Text říká 'Krok tři. Humanitární organizace použijí výsledky mapování při plánování činností pro snížení rizika a při reakci na katastrofy, aby zachránily životy.'" +ProfileGraphic: "Kreslený obrázek počítačové plochy ukazuje rozložení uživatelského profilu. Hlavní orientační panel je šedý, a je zde napodobenina profilového obrázku s šedou kreslenou postavou s malým logem Missing Maps na hrudi." +SatelliteOfLove: "Kreslený obrázek satelitu. Je oranžový a ukazuje dolů." +Stars: "Obrázek je prázdný." +helper: "Napodobenina profilového obrázku s šedou kreslenou postavou s malým logem Missing Maps na hrudi." +404: "Man in Red vest with 'Liberian Red Cross' logo points accorss a river." +mapathon: "Muž v červené vestě s logem Liberijského červeného kříže ukazuje přes řeku." +mapathon2: "Dvě ženy se usmívají, zatímco si užívají dobrovolničení a dívají se na počítač. " +mapathon3: "Učebna vybavená množstvím stolů. Za každým jsou mappeři s počítači a nápoji." +mapathon4: "Tři muži zkoumají mapu na zdi. Jeden ukazuje perem." +mapathon5: "Muž v košili vede dobrovolnické setkání. Lidé sledují projekci za ním." +mapathon6: "Lidé se shromažďují v krytém otevřeném prostoru, poslouchají a sledují ženu v triku s Červeným křížem. Žena má telefon, se kterým nahrává informace." +process: "Paprsky žlutého satelitu vysílají dolů na Zem. Nalevo, pod nápisem 'Krok 1: Vzdálené dobrovolníci trasují satelitní snímky do OpenStreetMap', sedí u stolu s počítači dvě modré postavy. Pod paprsky jsou na zemském povrchu tři kulaté chýše s textem nad sebou. Text uvádí 'Krok 2: Místní dobrovolníci přidávají detaily jako čtvrti, názvy ulic a evakuační centra.' Napravo skupina tří červených postav. Prostřední z nich má znak červeného kříže na hrudi. Text nad nimi říká ' Krok 3: Humanitární organizace využívají zmapované informace k plánování snižování rizik a odpovídající reakce na katastrofu, které zachraňují životy.'" +validate: "Close up of a desk, five computers are open to mapping. We see a map of the world and a printout of mapping instructions. A hand is on the keypad of the computer." #################### ## HEADER CONTENT ## @@ -70,8 +70,6 @@ nav: url: "/cs/akce/" - text: "USPOŘÁDEJTE AKCI" url: "/cs/organizuj/" - - text: "PODPORA MAPATHONU" - url: "/cs/organizuj/#helper-map-contents" - text: "O PROJEKTU" url: "/cs/o-projektu/" - text: "BLOG" @@ -96,7 +94,7 @@ how_we_work: step1: text: "Krok 1." # approximate max length -------------------------------------|| - line1: "Vzdálení dobrovolníci překreslí satelitní" + line1: "Vzdálené dobrovolníci překreslí satelitní" # approximate max length ----------------------------------|| line2: "snímky do OpenStreetMap " step2: @@ -225,7 +223,7 @@ field: - label: "KoBo - KoBoToolbox je sada nástrojů pro sběr dat v terénu pro použití v náročných podmínkách. " - label: "Organic Maps - open source mobilní aplikace zdarma, která poskytuje offline mapy ze zdrojů OpenStreetMap dat." - label: "OSMAnd - mapa pro mapování a navigaci s volitelnou možností offline kapacity." - - label: "Portable OpenStreetMap (POSM) - hardwarová/softwarová integrace vyvinutá pro mapování v terénu při nespolehlivém připojení k Internetu." + - label: "HOT Field Tasking Manager (FMTM) - nástroj pro koordinaci terénních mapovacích aktivit, umožňující týmům organizovat a sledovat mapovací úkoly v oblastech s omezenou konektivitou." - label: "OpenDroneMap - udržitelná řešení pro sběr, zpracování, analýzu a zobrazení leteckých dat pro podporu komunit, které se jimi zabývají." processing-header: "Zpracování" processing-about: "Takže teď, když už jste sesbírali data o komunitě, budete potřebovat zadat tyto informace do OpenStreetMap. V závislosti na tom, jak jste data sesbírali, existuje několik způsobů, jak to provést:" @@ -322,14 +320,7 @@ about: helper-map: title: "Podpora Mapathonu" - description: "Tým Missing Maps vás může podporovat mnoha způsoby. Oslovením na Twitteru, nebo Facebooku se na nás obraťte pro pomoc s výběrem úkolů, nebo máte-li nějaké dotazy. Kromě toho jsou dobrovolní mappeři po celém světě! Chcete-li se připojit k někomu ve vašem okolí, použijte níže uvedenou mapu. V rozbalovacích nabídkách můžete filtrovat podle jazyka. Zvětšení mapy vám pomůže zúžit seznam lidí ve vašem okolí.." - signup-txt: "Dobrovolně můžete pomoci přidáním Vašich kontaktních údajů do mapy přes tlačítko níže. Pro odstranění nebo editaci Vašich dat odešlete prosím email." - signup-btn: "Přihlásit se" - filter-lang: "Filtrovat podle jazyka" - filter-type: "Filtrovat podle typu" - all: "Vše" - remote: "Vzdálená podpora" - in-person: "Přímá/osobní podpora" + description: "Tým Missing Maps vás může podporovat mnoha způsoby. Oslovením na Twitteru, nebo Facebooku se na nás obraťte pro pomoc s výběrem úkolů, nebo máte-li nějaké dotazy." ##################### ## HOST A MAPATHON ## @@ -362,7 +353,7 @@ host: - label: "Rozhodněte, zda chcete udělat osobní nebo online meeting" - label: "Vyzvat dobrovolníky k pomoci" - label: "Rezervovat místo" - - label: "Registrovat mapathon zde" + - label: "Registrovat mapathon zde" - label: "Vytvořte bannery a/nebo plakáty pro vaši událost s logem Missing Maps, nebo s editovatelnou verzí loga pro Missing Maps komunity." - label: "Oslovit dobrovolníky s pomocí Eventbrite" - label: "Vybrat mapovací úlohu na Tasking Manageru" diff --git a/app/_data/en.yml b/app/_data/en.yml index 5af620ffa..7fe9d5e8b 100644 --- a/app/_data/en.yml +++ b/app/_data/en.yml @@ -66,12 +66,10 @@ nav: url: "/mapswipe/" - text: "EVENTS" links: - - text: "CURRENT EVENTS" + - text: "EVENTS" url: "/events/" - text: "ORGANIZE AN EVENT" url: "/host/" - - text: "MAPATHON SUPPORT" - url: "/host/#helper-map-contents" - text: "ABOUT" url: "/about/" - text: "BLOG" @@ -226,7 +224,7 @@ field: - label: "KoBo - KoBoToolbox is a suite of tools for field data collection for use in challenging environments. " - label: "Organic Maps - a free, open source mobile app that provides offline maps based on OpenStreetMap data." - label: "OSMAnd - a Mapping and navigation map with optional offline capacity." - - label: "Portable OpenStreetMap (POSM) - a hardware/software integration developed to conduct mapping in the field when internet and cellular connectivity is unreliable." + - label: "HOT Field Tasking Manager (FMTM) - a tool for coordinating field mapping activities, allowing teams to organize and track mapping tasks in areas with limited connectivity." - label: "OpenDroneMap - sustainable solutions for collecting, processing, analyzing and displaying aerial data while supporting the communities built around them. " processing-header: "Processing" processing-about: "So now that you have gathered data about a community, you will need to put this information into OpenStreetMap. Depending on how you collected your data, there are a few ways to do this:" @@ -325,14 +323,7 @@ about: helper-map: title: "Mapathon Support" - description: "The Missing Maps team can support you in a number of ways. Please reach out to us via Twitter or Facebook for help with task selection or if you have any questions. Additionally, volunteer mapathon supporters are located around the globe! Please use the below map to connect to someone in your area. You can filter by language using the dropdowns. Zooming the map will help you narrow down the list to people in your area." - signup-txt: "Volunteer to help out by adding your contact info to the map via the button below. To remove or edit your data please send an email." - signup-btn: "Sign up" - filter-lang: "Filter by a language" - filter-type: "Filter by type" - all: "All" - remote: "Remote" - in-person: "In Person" + description: "The Missing Maps team can support you in a number of ways. Please reach out to us via Twitter or Facebook for help with task selection or if you have any questions." ##################### ## HOST A MAPATHON ## @@ -356,7 +347,7 @@ host: - label: "Choose a date" - label: "Recruit volunteers to help plan the event" - label: "Book a space" - - label: "Register your event here" + - label: "Register your event here" - label: "Make banners or posters using the Missing Maps logo and/or the customizable community logo template" - label: "Recruit participants using Eventbrite" - label: "Pick a task using the Tasking Manager" diff --git a/app/_data/es.yml b/app/_data/es.yml index 8f77d0b9e..e177f667d 100644 --- a/app/_data/es.yml +++ b/app/_data/es.yml @@ -70,8 +70,6 @@ nav: url: "/es/eventos/" - text: "ORGANIZAR UN EVENTO" url: "/es/organizar/" - - text: "APOYO EN MAPATONES" - url: "/es/organizar/#helper-map-contents" - text: "ACERCA DE" url: "/es/acercade/" - text: "BLOG" @@ -225,7 +223,7 @@ field: - label: " Kobo - KoBoToolbox es un conjunto de herramientas para la recolección de datos para su uso en entornos difíciles." - label: " Organic Maps - una aplicación móvil libre, de código abierto que proporciona mapas sin conexión basados en datos de OpenStreetMap." - label: " Osmand -. Un mapa y navegación con capacidad sin conexión opcional." - - label: "Portable OpenStreetMap (POSM) - una integración de hardware y software desarrollada para llevar a cabo la cartografía sobre el terreno cuando la conectividad a Internet y a los móviles no es fiable." + - label: "HOT Field Tasking Manager (FMTM) - una herramienta para coordinar actividades de mapeo en el campo, permitiendo a los equipos organizar y rastrear tareas de mapeo en áreas con conectividad limitada." - label: " OpenDroneMap -. Soluciones sostenibles para la recogida, el tratamiento, el análisis y la visualización de datos aéreos, apoyando al mismo tiempo a las comunidades construidas a su alrededor." processing-header: "Procesamiento" processing-about: "Ahora que se han reunido datos sobre una comunidad, tendrás que poner esta información en OpenStreetMap. Dependiendo de la forma en que han recopilado los datos, hay varias maneras de hacerlo:" @@ -323,14 +321,7 @@ about: helper-map: title: "Ayuda para Mapatones" - description: "El equipo de Missing Maps puede ayudarte de varias maneras. Ponte en contacto con nosotros a través de Twitter o Facebook para que te ayudemos la selección de tareas o si tienes alguna pregunta. Además, hay voluntarios que apoyan mapatones en todo el mundo. Utiliza el siguiente mapa para ponerte en contacto con alguien de tu zona. Puedes filtrar por idioma utilizando los desplegables. Hacer zoom en el mapa te ayudará a reducir la lista a las personas de tu zona." - signup-txt: "Ofrécete a ayudar añadiendo tus datos de contacto al mapa a través del botón de abajo. Para eliminar o editar sus datos, envíe un email." - signup-btn: "Registrar" - filter-lang: "Filtrar por idioma" - filter-type: "Filtrar por tipo" - all: "Todos" - remote: "Remoto" - in-person: "En persona" + description: "El equipo de Missing Maps puede ayudarte de varias maneras. Ponte en contacto con nosotros a través de Twitter o Facebook para que te ayudemos la selección de tareas o si tienes alguna pregunta." ##################### ## HOST A MAPATHON ## @@ -354,7 +345,7 @@ host: - label: "Escoge una fecha" - label: "Capta voluntarios para ayudar" - label: "Reserva un espacio de encuentro" - - label: "Registra tu evento aquí " + - label: "Registra tu evento aquí " - label: "Crea pancartas o carteles para el evento con el logotipo de Missing Maps y/o la plantilla de logotipo de la comunidad personalizable " - label: "Capta participantes usando Eventbrite o una plataforma similar" - label: "Elegir una tarea utilizando el Gestor de tareas" diff --git a/app/_data/fr.yml b/app/_data/fr.yml index 08d1fb555..9f412195d 100644 --- a/app/_data/fr.yml +++ b/app/_data/fr.yml @@ -4,46 +4,46 @@ img-alt: wright-stuff: "..." arrow: "..." - blog: "..." - Edit: "..." - Changeset: "..." - Building: "..." - fieldmapping1: "Group of volunteers conduct surveys in the street" - fieldmapping2: "MSF personnel host community meeting" - Road: "..." - MM-White: "..." - mapswipe-before: "..." - mapswipe-after: "..." - mapswipe-squares: "..." - mapswipe-footer: "..." - MapNow: "Un dessin d'ordinateur est affiché. L'image sur l'écran montre 2 personnages avec des éléments de carte à échelle réelle. Un homme est placé à la frontière autour de la structure, tandis qu'une femme court vers l'homme avec une icône PointOfInterest (POI)." - Mapathon: "Un groupe varié de cinq personnages sont à un mapathon. Quatre ont des ordinateurs, tandis que l'un supervise et mange de la pizza." - Donate: "Un dessin d'un homme et d'une femme qui se serrent la main et sourient." - Checklist: "Un dessin d'une liste sur un presse-papiers avec quatre cases. Deux ont été cochées. Il y a aussi une multiprise et un crayon à papier et une icône de l'oiseau de Twitter." - Checklist-2: "Un dessin d'une liste avec quatre cases. Trois ont été cochées. Il y a aussi un crayon à papier." - Checklist-3: "Un dessin d'un presse-papiers avec un logo de Missing Maps au-dessus et un symbole de téléchargement." - LeaderboardGraphic: "Deux graphes : un bleu et un vert. Aucune donnée ne s'y trouve." - Learn-MapNow: "Un dessin d'ordinateur, avec un logo OSM dessus. Le logo OSM est une loupe au sommet d'une carte." - Learn-Tutorials: "Un dessin d'ordinateur avec un logo LearnOSM dessus. Le logo LearnOSM est une loupe au sommet d'une carte rectangulaire verte." - Learn-YouTube: "Un dessin d'ordinateur avec un logo Youtube dessus. Le logo Youtube est un carré rouge avec un symbole de triangle blanc de lecture." - MMlogo-Outlined: "Le logo Missing Maps est un cercle gris rempli de rectangles multicolores." - Process(outlined-text): "Une image en trois parties. La première présente deux personnages devant des ordinateurs sur un fond bleu. Il y a une part de pizza. Le texte dit 'Comment nous travaillons : Étape 1. Des volontaires à distance tracent des images satellites dans OpenStreetMap.'. La seconde présente un personnage se déplaçant entre deux structures tandis qu'il tient un ordinateur. Le fond est vert. La structure sur la gauche est un bâtiment avec un toit pointu. La structure sur la droite est un bâtiment avec un toit rond en forme de champignon. Le texte dit 'Étape 2. Des communautés de bénévoles ajoutent des détails locaux tel que des quartiers, des noms de rues, des centres d'évacuation.'. La troisième présente trois personnages sur un fond orange. Le personnge du milieu a son bras autour des personnes à côté de lui. Il a un emblème de la Croix-Rouge sur sa chemise. Il y a deux icônes de bâtiments dans l'arrière-plan. Le texte dit Étape 3. Les organisations humanitaires utilisent les informations cartographiées pour planifier des activités de réduction du risque et de réponse aux catastrophes pour sauver des vies." - Process-PartOne: "2 personnages devant des ordinateurs sur un fond bleu. Il y a une part de pizza. Le texte dit 'Comment nous travaillons : Étape 1. Des volontaires à distance tracent des images satellites dans OpenStreetMap.'" - Process-PartTwo: "Un personnage se déplace entre 2 structures tandis qu'il tient un ordinateur. Le fond est vert. La structure sur sa gauche est un bâtiment avec un toit pointu. La structure sur sa droite est un bâtiment avec un toit rond en forme de champignon. Le texte dit 'Étape 2. Des communautés de bénévoles ajoutent des détails locaux tel que des quartiers, des noms de rues, des centres d'évacuation.'" - Process-PartThree: "Trois personnages sur un fond orange. Le personnage du milieu a son bras autour des personnes à côté de lui. Il a un emblème de la Croix-Rouge sur sa chemise. Il y a deux icônes de bâtiments dans l'arrière-plan. Le texte dit Étape trois. Les organisations humanitaires utilisent les informations cartographiées pour planifier des activités de réduction du risque et de réponse aux catastrophes pour sauver des vies.'" - ProfileGraphic: "Un dessin d'écran d'ordinateur montre la disposition du profil utilisateur. La barre de navigation supérieure est grise et il y a une fausse photo de profil d'un personnage gris avec un petit logo Missing Maps sur sa poitrine." - SatelliteOfLove: "Un dessin d'un satellite. Il est orange et ouvert pointant vers le bas." - Stars: "L'image est vide." - helper: "Une fausse photo de profil d'un personnage gris avec un petit logo Missing Maps sur sa poitrine." - 404: "Un homme en gilet rouge montre du doigt une rivière." - mapathon: "Deux femmes sourient tout en appréciant leur bénévolat et regardent leur ordinateur." - mapathon2: "Une configuration de salle de classe avec de multiple tables. Les cartographes sont chacun face à un ordinateur avec des boissons." - mapathon3: "Trois hommes examinent une carte accrochée à un mur. L'un d'eux la pointe avec un crayon." - mapathon4: "Trois personnes regardent une carte accrochée à un mur. Une femme sourit et deux hommes prennent des notes avec des crayons." - mapathon5: "L'homme en chemise boutonnée avec une chemise boutonnée dirige un évènement de bénévoles. Les gens regardent la projection derrière lui." - mapathon6: "Les gens se regroupent dans un espace ouvert et couvert et écoutent et regardent une femme avec un t-shirt de la Croix-Rouge. Elle a un téléphone et est en train d'enregistrer des informations." - process: "Un satellite jaune projette ses rayons sur la terre. Sur la gauche, deux images de bonhommes allumettes bleus assis sur un bureau avec des ordinateurs sous une bannière. 'Étape 1 : Des bénévoles à distance tracent des images satellites sur OpenStreetMap'. Sous les rayons, trois huttes rondes sont sur la surface de la terre avec un texte au-dessus. Le texte dit 'Étape 2 : Des communautés de bénévoles ajoutent des détails locaux comme des quartiers, des noms de rues, des centres d'évacuation'. Sur la droite, trois bonhommes allumettes rouges sont regroupés. Le personnage du milieu a un emblême de la Croix-Rouge sur sa poitrine. Le texte ci-dessus indique 'Étape 3 : Des organisations humanitaires utilisent des informations cartographiées pour plannifier des activités de réduction du risque et de réponse aux catastrophes pour sauver des vies.'" - validate: "Sur un bureau, cinq ordinateurs sont ouverts sur la cartographie. Nous voyons une carte du monde et une impression des instructions de cartographie. Une main est sur le clavier de l'ordinateur." +blog: "..." +Edit: "..." +Changeset: "..." +Building: "..." +fieldmapping1: "Group of volunteers conduct surveys in the street" +fieldmapping2: "MSF personnel host community meeting" +Road: "..." +MM-White: "..." +mapswipe-before: "..." +mapswipe-after: "..." +mapswipe-squares: "..." +mapswipe-footer: "..." +MapNow: "Un dessin d'ordinateur est affiché. L'image sur l'écran montre 2 personnages avec des éléments de carte à échelle réelle. Un homme est placé à la frontière autour de la structure, tandis qu'une femme court vers l'homme avec une icône PointOfInterest (POI)." +Mapathon: "Un groupe varié de cinq personnages sont à un mapathon. Quatre ont des ordinateurs, tandis que l'un supervise et mange de la pizza." +Donate: "Un dessin d'un homme et d'une femme qui se serrent la main et sourient." +Checklist: "Un dessin d'une liste sur un presse-papiers avec quatre cases. Deux ont été cochées. Il y a aussi une multiprise et un crayon à papier et une icône de l'oiseau de Twitter." +Checklist-2: "Un dessin d'une liste avec quatre cases. Trois ont été cochées. Il y a aussi un crayon à papier." +Checklist-3: "Un dessin d'un presse-papiers avec un logo de Missing Maps au-dessus et un symbole de téléchargement." +LeaderboardGraphic: "Deux graphes : un bleu et un vert. Aucune donnée ne s'y trouve." +Learn-MapNow: "Un dessin d'ordinateur, avec un logo OSM dessus. Le logo OSM est une loupe au sommet d'une carte." +Learn-Tutorials: "Un dessin d'ordinateur avec un logo LearnOSM dessus. Le logo LearnOSM est une loupe au sommet d'une carte rectangulaire verte." +Learn-YouTube: "Un dessin d'ordinateur avec un logo Youtube dessus. Le logo Youtube est un carré rouge avec un symbole de triangle blanc de lecture." +MMlogo-Outlined: "Le logo Missing Maps est un cercle gris rempli de rectangles multicolores." +Process(outlined-text): "Une image en trois parties. La première présente deux personnages devant des ordinateurs sur un fond bleu. Il y a une part de pizza. Le texte dit 'Comment nous travaillons : Étape 1. Des volontaires à distance tracent des images satellites dans OpenStreetMap.'. La seconde présente un personnage se déplaçant entre deux structures tandis qu'il tient un ordinateur. Le fond est vert. La structure sur la gauche est un bâtiment avec un toit pointu. La structure sur la droite est un bâtiment avec un toit rond en forme de champignon. Le texte dit 'Étape 2. Des communautés de bénévoles ajoutent des détails locaux tel que des quartiers, des noms de rues, des centres d'évacuation.'. La troisième présente trois personnages sur un fond orange. Le personnge du milieu a son bras autour des personnes à côté de lui. Il a un emblème de la Croix-Rouge sur sa chemise. Il y a deux icônes de bâtiments dans l'arrière-plan. Le texte dit Étape 3. Les organisations humanitaires utilisent les informations cartographiées pour planifier des activités de réduction du risque et de réponse aux catastrophes pour sauver des vies." +Process-PartOne: "2 personnages devant des ordinateurs sur un fond bleu. Il y a une part de pizza. Le texte dit 'Comment nous travaillons : Étape 1. Des volontaires à distance tracent des images satellites dans OpenStreetMap.'" +Process-PartTwo: "Un personnage se déplace entre 2 structures tandis qu'il tient un ordinateur. Le fond est vert. La structure sur sa gauche est un bâtiment avec un toit pointu. La structure sur sa droite est un bâtiment avec un toit rond en forme de champignon. Le texte dit 'Étape 2. Des communautés de bénévoles ajoutent des détails locaux tel que des quartiers, des noms de rues, des centres d'évacuation.'" +Process-PartThree: "Trois personnages sur un fond orange. Le personnage du milieu a son bras autour des personnes à côté de lui. Il a un emblème de la Croix-Rouge sur sa chemise. Il y a deux icônes de bâtiments dans l'arrière-plan. Le texte dit Étape trois. Les organisations humanitaires utilisent les informations cartographiées pour planifier des activités de réduction du risque et de réponse aux catastrophes pour sauver des vies.'" +ProfileGraphic: "Un dessin d'écran d'ordinateur montre la disposition du profil utilisateur. La barre de navigation supérieure est grise et il y a une fausse photo de profil d'un personnage gris avec un petit logo Missing Maps sur sa poitrine." +SatelliteOfLove: "Un dessin d'un satellite. Il est orange et ouvert pointant vers le bas." +Stars: "L'image est vide." +helper: "Une fausse photo de profil d'un personnage gris avec un petit logo Missing Maps sur sa poitrine." +404: "Un homme en gilet rouge montre du doigt une rivière." +mapathon: "Deux femmes sourient tout en appréciant leur bénévolat et regardent leur ordinateur." +mapathon2: "Une configuration de salle de classe avec de multiple tables. Les cartographes sont chacun face à un ordinateur avec des boissons." +mapathon3: "Trois hommes examinent une carte accrochée à un mur. L'un d'eux la pointe avec un crayon." +mapathon4: "Trois personnes regardent une carte accrochée à un mur. Une femme sourit et deux hommes prennent des notes avec des crayons." +mapathon5: "L'homme en chemise boutonnée avec une chemise boutonnée dirige un évènement de bénévoles. Les gens regardent la projection derrière lui." +mapathon6: "Les gens se regroupent dans un espace ouvert et couvert et écoutent et regardent une femme avec un t-shirt de la Croix-Rouge. Elle a un téléphone et est en train d'enregistrer des informations." +process: "Un satellite jaune projette ses rayons sur la terre. Sur la gauche, deux images de bonhommes allumettes bleus assis sur un bureau avec des ordinateurs sous une bannière. 'Étape 1 : Des bénévoles à distance tracent des images satellites sur OpenStreetMap'. Sous les rayons, trois huttes rondes sont sur la surface de la terre avec un texte au-dessus. Le texte dit 'Étape 2 : Des communautés de bénévoles ajoutent des détails locaux comme des quartiers, des noms de rues, des centres d'évacuation'. Sur la droite, trois bonhommes allumettes rouges sont regroupés. Le personnage du milieu a un emblême de la Croix-Rouge sur sa poitrine. Le texte ci-dessus indique 'Étape 3 : Des organisations humanitaires utilisent des informations cartographiées pour plannifier des activités de réduction du risque et de réponse aux catastrophes pour sauver des vies.'" +validate: "Sur un bureau, cinq ordinateurs sont ouverts sur la cartographie. Nous voyons une carte du monde et une impression des instructions de cartographie. Une main est sur le clavier de l'ordinateur." #################### ## HEADER CONTENT ## @@ -70,8 +70,6 @@ nav: url: "/fr/evenements/" - text: "ORGANISER UN ÉVÉNEMENT" url: "/fr/organiser/" - - text: "SUPPORT MAPATHON" - url: "/fr/organiser/#helper-map-contents" - text: "À PROPOS" url: "/fr/apropos/" - text: "BLOG" @@ -224,7 +222,7 @@ field: - label: "KoBo - KoBoToolbox est une série d'outils qui collecte des données de terrain pour les utiliser dans des environnements exigeants." - label: "Organic Maps - une application mobile gratuite et libre d'accès qui fournit des cartes hors lignes basées sur des données d'OpenStreetMap." - label: "OSMAnd - Une carte de cartographie et de navigation avec en option des capacités hors connexion." - - label: "Portable OpenStreetMap (POSM) - Un hardware/software d'intégration développé pour conduire des cartographies sur des terrains avec une faible connexion internet et cellulaire." + - label: "HOT Field Tasking Manager (FMTM) - un outil pour coordonner les activités de cartographie sur le terrain, permettant aux équipes d'organiser et de suivre les tâches de cartographie dans des zones avec une connectivité limitée." - label: "OpenDroneMap - des solutions durables pour collecter, traiter, analyser et afficher des données aériennes avec le support de la communauté construite autour d'elles." processing-header: "Traitement" processing-about: "Maintenant que vous avez récolté les données sur une communauté, vous aurez besoin de mettre cette informations sur OpenStreetMap. En fonction de la façon dont vous collectez vos données, il y a différentes façons de le faire." @@ -322,14 +320,7 @@ about: helper-map: title: "Soutien aux mapathons" - description: "L'équipe Missing Maps peut vous soutenir de nombreuses façons. N'hésitez pas à nous contacter via Twitter ou Facebook pour de l'aide dans la sélection de tâches ou si vous avez des questions. De plus, les volontaires participants aux mapathons sont localisés dans le monde entier ! Utilisez la carte ci-dessous pour vous connecter à quelqu'un dans votre zone. Vous pouvez choisir la langue en utilisant les listes déroulantes. Zoomer sur la carte vous aidera à réduire la liste aux personnes de votre région." - signup-txt: "Candidatez pour offir votre aide en ajoutant vos coordonnées sur la carte grâce au boutton ci-dessous. Pour supprimer ou modifier vos données, envoyez s'il vous plaît un mail à email." - signup-btn: "S'enregistrer" - filter-lang: "Filtre par langue" - filter-type: "Filtre par type" - all: "Tous" - remote: "A distance" - in-person: "En présentiel" + description: "L'équipe Missing Maps peut vous soutenir de nombreuses façons. N'hésitez pas à nous contacter via Twitter ou Facebook pour de l'aide dans la sélection de tâches ou si vous avez des questions." ##################### ## HOST A MAPATHON ## @@ -353,7 +344,7 @@ host: - label: "Choisissez une date." - label: "Recrutez des bénévoles pour aider." - label: "Réservez un lieu de réunion." - - label: "Enregistrez votre évènement ici" + - label: "Enregistrez votre évènement ici" - label: "Créez des bannières ou des affiches en utilisant le logo Missing Maps et/ou le modèle du logo personnalisable pour les communautés Missing Maps" - label: "Recrutez des participants utilisant Eventbrite ou une plateforme similaire." - label: "Choisissez une tâche en utilisant le Tasking Manager" diff --git a/app/_includes/Process-Template-Mobile.svg b/app/_includes/Process-Template-Mobile.svg index 7f896598f..3ea9e158b 100644 --- a/app/_includes/Process-Template-Mobile.svg +++ b/app/_includes/Process-Template-Mobile.svg @@ -216,4 +216,4 @@ - + \ No newline at end of file diff --git a/app/_includes/Process-Template.svg b/app/_includes/Process-Template.svg index 733bc01c1..f66f58b47 100644 --- a/app/_includes/Process-Template.svg +++ b/app/_includes/Process-Template.svg @@ -220,4 +220,4 @@ - + \ No newline at end of file diff --git a/app/_includes/events.html b/app/_includes/events.html index 27aa818ae..fa2fa7097 100644 --- a/app/_includes/events.html +++ b/app/_includes/events.html @@ -4,12 +4,15 @@
-

{{site.data[locale].events.title}}

+

{{site.data[locale].events.title}}

+

+ This is a selection of OSM events from OSMCal.org. For more OSM events in your community be sure to visit OSMCal.org. +

- + {{site.data[locale].events.register_event}} {{site.data[locale].img-alt.Arrow}} @@ -22,88 +25,5 @@

{{site.data[locale].events.title}}

- - - - + \ No newline at end of file diff --git a/app/_includes/events_min.html b/app/_includes/events_min.html index 6bbcdaa73..d5373ebff 100644 --- a/app/_includes/events_min.html +++ b/app/_includes/events_min.html @@ -1,78 +1 @@ -
- - - - - + diff --git a/app/_includes/get_locale.html b/app/_includes/get_locale.html index 79275c423..8e62165f5 100644 --- a/app/_includes/get_locale.html +++ b/app/_includes/get_locale.html @@ -1 +1 @@ -{% comment %}Getting the locale from the url{% endcomment %}{% capture locale %}{{ page.url | truncate: 3, "" | remove: "/" }}{% endcapture %}{% unless site.authorized_locales contains locale %}{% assign locale = site.default_locale %}{% endunless %} +{% comment %}Getting the locale from Jekyll Polyglot{% endcomment %}{% assign locale = site.active_lang %} \ No newline at end of file diff --git a/app/_includes/header.html b/app/_includes/header.html index ef03ef65f..8e1eeaf85 100755 --- a/app/_includes/header.html +++ b/app/_includes/header.html @@ -25,15 +25,16 @@ | @@ -55,15 +56,17 @@ {% endfor %}{% endif %} {% endfor %}
- {% for loc in site.authorized_locales %} {% if loc == site.default_locale %} - -
{{loc}}
-
+ {% for lang in site.languages %} + {% if lang == site.default_lang %} + +
{{lang}}
+
{% else %} - -
{{loc}}
-
- {% endif %} {% endfor %} + +
{{lang}}
+
+ {% endif %} + {% endfor %}
diff --git a/app/_includes/helper-map.html b/app/_includes/helper-map.html index 79d00af26..95d745962 100644 --- a/app/_includes/helper-map.html +++ b/app/_includes/helper-map.html @@ -1,5 +1,3 @@ - -
@@ -7,552 +5,7 @@
{{site.data[locale].helper-map.title}}

{{site.data[locale].helper-map.description}}


-

{{site.data[locale].helper-map.signup-txt}}

-

{{site.data[locale].helper-map.signup-btn}}

- -
-
-
-
-
- -
- -
-
-
-
- -
-
- -
-
-
-
- -
- -
- -
- - - - - - - - - - - - - -
+ \ No newline at end of file diff --git a/app/_includes/host.html b/app/_includes/host.html index ad9f1122b..90a1d073c 100644 --- a/app/_includes/host.html +++ b/app/_includes/host.html @@ -32,7 +32,7 @@

{{site.data[locale].host.title}}

{{site.data[locale].host.prep_btn}} {{site.data[locale].host.check_btn}} {{site.data[locale].host.materials_btn}} - {{site.data[locale].host.register_event}} {{site.data[locale].img-alt.Arrow}} + {{site.data[locale].host.register_event}} {{site.data[locale].img-alt.Arrow}}
diff --git a/app/_includes/landing.html b/app/_includes/landing.html index 9c26e4546..87fba062e 100644 --- a/app/_includes/landing.html +++ b/app/_includes/landing.html @@ -56,7 +56,7 @@

{{site.data[locale].banner.title}}

{{site.data[locale].how_to_participate.start}}
{{site.data[locale].how_to_participate.start_text}}
{{site.data[locale].how_to_participate.learn_btn}}
-
{{site.data[locale].how_to_participate.map_btn}}
+
{{site.data[locale].how_to_participate.map_btn}}
@@ -201,22 +201,8 @@

{{site.data[locale].banner.title}}

- - - -
-
{{site.data[locale].events.title}}
- {% include events_min.html %} -
-
- {{site.data[locale].events.all_btn}} -
- - {% include members.html %} - - diff --git a/app/_includes/members.html b/app/_includes/members.html index d3992e8be..aedb9c12a 100644 --- a/app/_includes/members.html +++ b/app/_includes/members.html @@ -73,10 +73,10 @@

OpenStreetMap
-

OpenStreetMap {{site.data[locale].about.osm_text}} OpenStreetMap Foundation.

+

OpenStreetMap {{site.data[locale].about.osm_text}} OpenStreetMap Foundation.

diff --git a/app/_layouts/default.html b/app/_layouts/default.html index f13f37ea6..5c260b55c 100755 --- a/app/_layouts/default.html +++ b/app/_layouts/default.html @@ -23,7 +23,9 @@ - + @@ -72,7 +74,7 @@

No can do!