{"id":2241,"date":"2025-05-22T14:06:59","date_gmt":"2025-05-22T18:06:59","guid":{"rendered":"https:\/\/gmsh.ca\/localizar-servicos\/"},"modified":"2026-02-02T16:34:40","modified_gmt":"2026-02-02T21:34:40","slug":"localizar-servicos","status":"publish","type":"page","link":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/","title":{"rendered":"Localizar servi\u00e7os"},"content":{"rendered":"\n<section class=\"w-full px-4 sm:px-8 md:px-16 pt-6 md:pt-28\" style=\"background-color: var(--wp--preset--color--pink-soft);\">\n    <div class=\"max-w-screen-xl mx-auto flex flex-col lg:flex-row items-start justify-between gap-4\">\n        <div class=\"flex-1 space-y-6 text-left py-0 lg:py-28\">\n                            <h1 class=\"text-black text-left\">\n                    Localizar <span>servi\u00e7os<\/span>                <\/h1>\n                                        <div class=\"text-black text-lg md:text-xl leading-normal text-left mb-10\">\n                    <p>Use nosso localizador de servi\u00e7os para ajud\u00e1-lo a localizar recursos perto de voc\u00ea.<\/p>\n                <\/div>\n                        <div>\n                \n<!-- AlpineJS component -->\n<div \n    x-data=\"servicesFilter()\"\n    data-language=\"pt-br\"\n>\n\n    <!-- Form container: submit prevented for AlpineJS handling -->\n    <form class=\"flex flex-col items-start gap-6\" @submit.prevent=\"updateResults\">\n\n\n        <!-- Address input and search button -->\n        <div class=\"flex flex-row gap-4 items-center w-full md:w-[378px]\">\n            <label for=\"simple-search\" class=\"sr-only\">Endere\u00e7o ou c\u00f3digo postal<\/label>\n            <div class=\"relative flex-1\">\n                <!-- Search icon inside input -->\n                <div class=\"absolute inset-y-0 start-0 flex items-center ps-3 pointer-events-none\">\n                    <svg width=\"20\" height=\"19\" viewBox=\"0 0 20 19\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                        <path d=\"M8.5 16C10.275 15.9996 11.9988 15.4054 13.397 14.312L17.793 18.708L19.207 17.294L14.811 12.898C15.905 11.4997 16.4996 9.77544 16.5 8C16.5 3.589 12.911 0 8.5 0C4.089 0 0.5 3.589 0.5 8C0.5 12.411 4.089 16 8.5 16ZM8.5 2C11.809 2 14.5 4.691 14.5 8C14.5 11.309 11.809 14 8.5 14C5.191 14 2.5 11.309 2.5 8C2.5 4.691 5.191 2 8.5 2Z\" fill=\"black\"\/>\n                    <\/svg>\n                <\/div>\n\n                <!-- Address input -->\n                <input\n                    type=\"text\"\n                    id=\"simple-search\"\n                    x-model=\"filters.address\"\n                    class=\"bg-white border border-black text-gray-900 text-md rounded-full focus:ring-blue-500 focus:border-blue-500 block w-full ps-10 px-3 py-2\"\n                    placeholder=\"Endere\u00e7o ou c\u00f3digo postal\"\n                    @keydown.enter.prevent=\"updateResults\"\n                \/>\n            <\/div>\n\n            <!-- Search button -->\n            <button type=\"submit\"\n                class=\"btn self-start inline-block bg-black text-white text-base rounded-md px-6 py-2 font-medium no-underline transition-colors duration-300 ease-in-out hover:bg-primary cursor-pointer\">\n                Encontre            <\/button>\n        <\/div>\n\n        <!-- Language & Attendance selects -->\n        <div class=\"flex flex-col md:flex-row md:items-center gap-6 w-full\">\n            <label for=\"language_select\" class=\"font-extrabold\">Filters:<\/label>\n\n            <!-- Wrapper for selects -->\n            <div class=\"flex flex-row gap-6 w-full\">\n                <!-- Language select -->\n                <select id=\"language_select\" x-model=\"filters.service_language\" @change=\"updateResults()\"\n                    class=\"block px-0 w-fit text-md border-b border-transparent hover:border-black\">\n                    <option value=\"\">Op\u00e7\u00e3o de idioma<\/option>\n                                            <option value=\"ingles\">Ingl\u00eas<\/option>\n                                            <option value=\"frances\">Franc\u00eas<\/option>\n                                            <option value=\"espanhol\">Espanhol<\/option>\n                                    <\/select>\n\n                <!-- Attendance select -->\n                <select id=\"attendance_select\" x-model=\"filters.service_attendance\" @change=\"updateResults()\"\n                    class=\"block px-0 w-fit text-md border-b border-transparent hover:border-black\">\n                    <option value=\"\">Op\u00e7\u00e3o de participa\u00e7\u00e3o<\/option>\n                                            <option value=\"virtual\">Virtual<\/option>\n                                            <option value=\"in-person\">In-Person<\/option>\n                                    <\/select>\n            <\/div>\n        <\/div>\n\n        <!-- Service type checkboxes -->\n        <div class=\"flex flex-col md:flex-row gap-4 md:items-center\">\n            <label for=\"language_select\" class=\"font-extrabold\">Service Type:<\/label>\n            <!-- Wrapper for checkboxes -->\n            <div class=\"flex flex-row flex-wrap gap-2 md:gap-4\">\n                                    <div class=\"flex relative\">\n                        <!-- Hidden checkbox (still focusable) -->\n                        <input\n                            type=\"checkbox\"\n                            id=\"acesso-a-prep\"\n                            class=\"absolute opacity-0 peer\"\n                            x-model=\"filters.service_offerings\"\n                            value=\"acesso-a-prep\"\n                            @change=\"updateResults()\"\n                        \/>\n                        <!-- Label styled with Tailwind + peer-checked states -->\n                        <label\n                            for=\"acesso-a-prep\"\n                            class=\"select-none cursor-pointer rounded-full border border-black py-2 px-3 md:py-[10px] md:px-[18px] font-medium text-black transition-colors duration-200 ease-in-out hover:bg-white peer-checked:bg-primary peer-checked:hover:bg-primary peer-checked:text-white peer-checked:border-primary peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\"\n                        >\n                            Acesso \u00e0 PrEP                        <\/label>\n                    <\/div>\n                                    <div class=\"flex relative\">\n                        <!-- Hidden checkbox (still focusable) -->\n                        <input\n                            type=\"checkbox\"\n                            id=\"faca-o-teste\"\n                            class=\"absolute opacity-0 peer\"\n                            x-model=\"filters.service_offerings\"\n                            value=\"faca-o-teste\"\n                            @change=\"updateResults()\"\n                        \/>\n                        <!-- Label styled with Tailwind + peer-checked states -->\n                        <label\n                            for=\"faca-o-teste\"\n                            class=\"select-none cursor-pointer rounded-full border border-black py-2 px-3 md:py-[10px] md:px-[18px] font-medium text-black transition-colors duration-200 ease-in-out hover:bg-white peer-checked:bg-primary peer-checked:hover:bg-primary peer-checked:text-white peer-checked:border-primary peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\"\n                        >\n                            Fa\u00e7a o teste                        <\/label>\n                    <\/div>\n                                    <div class=\"flex relative\">\n                        <!-- Hidden checkbox (still focusable) -->\n                        <input\n                            type=\"checkbox\"\n                            id=\"suporte-ao-uso-de-substancias\"\n                            class=\"absolute opacity-0 peer\"\n                            x-model=\"filters.service_offerings\"\n                            value=\"suporte-ao-uso-de-substancias\"\n                            @change=\"updateResults()\"\n                        \/>\n                        <!-- Label styled with Tailwind + peer-checked states -->\n                        <label\n                            for=\"suporte-ao-uso-de-substancias\"\n                            class=\"select-none cursor-pointer rounded-full border border-black py-2 px-3 md:py-[10px] md:px-[18px] font-medium text-black transition-colors duration-200 ease-in-out hover:bg-white peer-checked:bg-primary peer-checked:hover:bg-primary peer-checked:text-white peer-checked:border-primary peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\"\n                        >\n                            Suporte ao uso de subst\u00e2ncias                        <\/label>\n                    <\/div>\n                                    <div class=\"flex relative\">\n                        <!-- Hidden checkbox (still focusable) -->\n                        <input\n                            type=\"checkbox\"\n                            id=\"organizacao-de-suporte\"\n                            class=\"absolute opacity-0 peer\"\n                            x-model=\"filters.service_offerings\"\n                            value=\"organizacao-de-suporte\"\n                            @change=\"updateResults()\"\n                        \/>\n                        <!-- Label styled with Tailwind + peer-checked states -->\n                        <label\n                            for=\"organizacao-de-suporte\"\n                            class=\"select-none cursor-pointer rounded-full border border-black py-2 px-3 md:py-[10px] md:px-[18px] font-medium text-black transition-colors duration-200 ease-in-out hover:bg-white peer-checked:bg-primary peer-checked:hover:bg-primary peer-checked:text-white peer-checked:border-primary peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\"\n                        >\n                            Organiza\u00e7\u00e3o de suporte                        <\/label>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n    <\/form>\n<\/div>\n\n<script>\nfunction servicesFilter() {\n    return {\n        \/\/ Language stored separately (not in filters)\n        language: '',\n        \n        \/\/ Reactive filters state\n        filters: {\n            address: '',\n            service_language: '',\n            service_attendance: '',\n            service_offerings: [],\n        },\n\n        \/**\n         * Initialize the component\n         * - Read language from data attribute\n         * - Read URL parameters to prefill filters\n         * - Handle service_offerings as comma-delimited array\n         * - Load results on page load\n         * - Listen for global reset event\n         *\/\n        init() {\n            \/\/ Get language from data attribute on the root element\n            this.language = this.$el?.dataset?.language || 'en';\n            \n            const urlParams = new URLSearchParams(window.location.search);\n\n            for (const [key, value] of urlParams.entries()) {\n                \/\/ Handle service_offerings as comma-delimited array\n                if (key === 'service_offerings') {\n                    this.filters.service_offerings = value.split(',').filter(v => v.trim() !== '');\n                } else if (this.filters.hasOwnProperty(key)) {\n                    \/\/ Set other filter values that exist in filters object\n                    this.filters[key] = value;\n                }\n            }\n\n            \/\/ Listen for a global reset event to clear filters\n            window.addEventListener('filters-reset', () => {\n                this.reset();\n            });\n\n            \/\/ Use setTimeout to ensure all components are initialized before dispatching event\n            setTimeout(() => {\n                this.updateResults();\n            }, 0);\n        },\n\n        \/**\n         * Reset all filters to their default values\n         * - Clears the filters object (language is preserved)\n         * - Reloads results\n         *\/\n        reset() {\n            this.filters = {\n                address: '',\n                service_language: '',\n                service_attendance: '',\n                service_offerings: [],\n            };\n\n            this.updateResults();\n        },\n\n        \/**\n         * Update results whenever a filter changes\n         * - Builds an object of active filters only\n         * - Includes language separately (not from filters)\n         * - Updates the URL query string for shareable links\n         * - Dispatches a custom event with active filters\n         *\/\n        updateResults() {\n            console.log('this.filters', this.filters);\n            const activeFilters = {};\n\n            \/\/ Include language separately (not from filters object)\n            if (this.language) {\n                activeFilters.language = this.language;\n            }\n\n            \/\/ Include only active filters\n            for (const [key, value] of Object.entries(this.filters)) {\n                if (typeof value === 'string' && value.trim() !== '') {\n                    activeFilters[key] = value.trim();\n                } else if (typeof value === 'object' && value.length > 0) {\n                    activeFilters[key] = value.join(',');\n                }\n            }\n\n            \/\/ Update browser URL without reloading\n            const queryString = new URLSearchParams(activeFilters).toString();\n            const newUrl = `${window.location.pathname}?${queryString}`;\n            history.replaceState(null, '', newUrl);\n\n            console.log('activeFilters', activeFilters);\n\n            \/\/ Dispatch custom event for results component to react\n            window.dispatchEvent(new CustomEvent('filters-changed', { detail: activeFilters }));\n        }\n    }\n}\n<\/script>\n\n            <\/div>\n        <\/div>\n        <div class=\"flex-1 flex justify-center items-center m-auto space-y-6 max-w-fit\">\n            <div class=\"relative w-[300px] h-[300px] sm:w-[415px] sm:h-[415px] overflow-hidden flex items-center justify-center\">\n                                    <img decoding=\"async\" src=\"https:\/\/gmsh.ca\/wp-content\/uploads\/2025\/09\/services.webp\"\n                        alt=\"\"\n                        class=\"object-contain max-w-full max-h-full\" \/>\n                            <\/div>\n        <\/div>\n    <\/div>\n<\/section>\n<section class=\"bg-white w-full px-4 sm:px-8 md:px-16 py-20 sm:py-24 md:py-28\">\n    <div class=\"max-w-screen-xl mx-auto flex flex-col gap-4\">\n                            <h2 class=\"text-black text-left mb-2\">\n                    Resultados                <\/h2>\n            \n            \n<div \n  x-data=\"servicesResults()\" \n  x-init=\"init()\" \n  @filters-changed.window=\"updateFilters($event.detail)\"\n>\n    <!-- Message showing current location -->\n    <div x-show=\"!loading &#038;&#038; services.length &#038;&#038; filters.address\" class=\"mb-6 text-black text-left text-xl\">\n        <span>\n            Veja o que encontramos mais pr\u00f3ximo da sua localiza\u00e7\u00e3o atual \n            <span class=\"font-bold\">( <span x-text=\"filters.address || 'N\/A'\"><\/span> )<\/span>\n        <\/span>\n    <\/div>\n\n    <!-- No results message -->\n    <div x-show=\"!loading &#038;&#038; services.length === 0\" class=\"flex flex-col items-center gap-4 text-center py-6 text-black\">\n        Nenhum servi\u00e7o foi encontrado.        <button \n        @click=\"resetFilters\"\n        class=\"inline-block w-fit px-4 py-2 bg-black text-white rounded-lg hover:bg-primary transition cursor-pointer\"\n        >\n            Redefinir filtros        <\/button>\n    <\/div>\n\n    <!-- Service Loop -->\n    <template x-if=\"services.length\">\n        <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n            <template x-for=\"service in services\" :key=\"service.id\">\n                <div class=\"flex flex-col gap-6 p-6 border border-pink-extra-dark rounded\">\n                    <h3 x-text=\"service.title\" class=\"text-left font-medium text-2xl mb-0\"><\/h3>\n                    <div class=\"flex flex-col md:flex-row gap-4 md:gap-8\">\n                        <div x-html=\"service.short_description\" class=\"text-left text-md text-black\"><\/div>\n                        <div class=\"flex flex-1 flex-col text-left min-w-2\/5\">\n                            <div class=\"text-md text-black\" x-show=\"service.website\">\n                                <span class=\"font-bold\">Site:<\/span>\n                                <a :href=\"service.website\" target=\"_blank\" x-text=\"new URL(service.website).hostname.replace(\/^www\\.\/, '')\" class=\"text-primary hover:underline\"><\/a>\n                            <\/div>\n                            <div class=\"text-md text-black\" x-show=\"service.distance_km\">\n                                <span class=\"font-bold\">Dist\u00e2ncia at\u00e9 voc\u00ea:<\/span>\n                                <span x-text=\"service.distance_km ? service.distance_km + 'km' : ''\"><\/span>\n                            <\/div>\n                            <div class=\"text-md text-black\">\n                                <span class=\"font-bold\">Idiomas falados:<\/span>\n                                <span x-text=\"service.activeLangs.join(', ')\"><\/span>\n                            <\/div>\n                            <div class=\"text-md text-black\">\n                                <span class=\"font-bold\">Presen\u00e7a:<\/span>\n                                <span x-text=\"service.activeAttendance.join(', ')\"><\/span>\n                            <\/div>\n                            <template x-for=\"[slug, offering] in Object.entries(service.service_types || {})\" :key=\"slug\">\n                                <div class=\"text-md text-black\">\n                                    <span class=\"font-bold\" x-text=\"offering.label + ':'\"><\/span>\n                                    <span x-text=\"offering.available\"><\/span>\n                                <\/div>\n                            <\/template>\n                        <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/template>\n        <\/div>\n    <\/template>\n\n    <!-- Loader -->\n    <div x-show=\"loading\" class=\"flex justify-center items-center py-6\">\n        <svg class=\"animate-spin h-8 w-8 text-gray-600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n            <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"><\/circle>\n            <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v8H4z\"><\/path>\n        <\/svg>\n    <\/div>\n\n    <div \n        x-show=\"!loading &#038;&#038; services.length &#038;&#038; page < totalPages\"\n        class=\"flex justify-center mt-10\"\n    >\n        <button\n            @click=\"loadMore\"\n            class=\"btn bg-black transition-colors duration-300 ease-in-out hover:bg-primary text-white px-4 py-2 border rounded-md font-medium text-md no-underline cursor-pointer\"\n        >\n            Carregar mais        <\/button>\n    <\/div>\n\n    <script>\n        function servicesResults() {\n            return {\n                \/\/ Reactive state\n                services: [],   \/\/ Array of fetched services\n                filters: {},    \/\/ Current filter values\n                loading: false, \/\/ Loading indicator\n                page: 1,\n                totalPages: 1,\n\n                \/**\n                 * Initialize component\n                 * - Wait for filters-changed event from filter component\n                 * - Filter component will dispatch on init, triggering initial load\n                 *\/\n                init() {\n                    \/\/ Wait for filters-changed event from filter component\n                    \/\/ Filter component dispatches this event on init with a setTimeout(0)\n                },\n\n                \/**\n                 * Fetch services from the REST API using current filters\n                 *\/\n                async loadServices() {\n                    this.loading = true;\n\n                    \/\/ Build query parameters for API\n                    const params = new URLSearchParams();\n                    \n                    for (const [key, value] of Object.entries(this.filters)) {\n                        if (value !== null && value !== undefined) {\n                            \/\/ Handle service_offerings array specially - convert to comma-delimited string\n                            if (key === 'service_offerings' && Array.isArray(value) && value.length > 0) {\n                                params.append('service_offerings', value.join(','));\n                            } else if (key !== 'service_offerings') {\n                                \/\/ Handle all other parameters\n                                if (typeof value === \"boolean\") {\n                                    params.append(key, value ? 1 : 0);\n                                } else {\n                                    params.append(key, value);\n                                }\n                            }\n                        }\n                    }\n\n                    params.append('page', this.page);\n\n                    try {\n                        const res = await fetch(`\/wp-json\/gmsh\/v1\/services?${params.toString()}`);\n                        const json = await res.json();\n\n                        if (this.page === 1) {\n                            this.services = json.data || [];\n                        } else {\n                            this.services = [...this.services, ...(json.data || [])];\n                        }\n\n                        this.totalPages = json.meta?.total_pages || 1;\n                    } catch (error) {\n                        console.error('Error fetching services:', error);\n                        if (this.page === 1) this.services = [];\n                    } finally {\n                        this.loading = false;\n                    }\n                },\n\n                \/**\n                 * Update filters when a global event is dispatched\n                 * - Convert service_offerings from comma-delimited string to array\n                 * - Store all active filters\n                 * - Reload services\n                 *\/\n                updateFilters(newFilters) {\n                    this.filters = {};\n\n                    \/\/ Handle service_offerings parameter (comma-delimited string from filter component)\n                    \/\/ Convert to array for easier handling\n                    if (newFilters.service_offerings) {\n                        const offeringSlugs = newFilters.service_offerings.split(',').map(s => s.trim()).filter(s => s);\n                        if (offeringSlugs.length > 0) {\n                            this.filters.service_offerings = offeringSlugs;\n                        }\n                    }\n\n                    \/\/ Handle legacy offerings parameter for backwards compatibility\n                    if (newFilters.offerings && !this.filters.service_offerings) {\n                        const offeringSlugs = newFilters.offerings.split(',').map(s => s.trim()).filter(s => s);\n                        if (offeringSlugs.length > 0) {\n                            this.filters.service_offerings = offeringSlugs;\n                        }\n                    }\n\n                    \/\/ Store all other active filters (excluding service_offerings\/offerings as they're handled above)\n                    for (const [key, value] of Object.entries(newFilters)) {\n                        if (key === \"service_offerings\" || key === \"offerings\") continue; \/\/ Skip as handled above\n                        \n                        if (typeof value === \"boolean\") {\n                            this.filters[key] = value;\n                        } else if (value !== null && value !== undefined && value !== \"\") {\n                            this.filters[key] = value;\n                        }\n                    }\n\n                    this.page = 1;\n                    \/\/ Reload services with new filters\n                    this.loadServices();\n                },\n\n                \/**\n                 * Reset all filters\n                 * - Clears filter state\n                 * - Reloads services\n                 * - Dispatches a custom event for other components\n                 *\/\n                resetFilters() {\n                    this.filters = {};\n                    this.loadServices();\n                    window.dispatchEvent(new CustomEvent('filters-reset'));\n                },\n                \n                \/**\n                 * Load more button handler\n                 *\/\n                loadMore() {\n                    if (this.page < this.totalPages) {\n                        if (!this.loading) {\n                            this.page++;\n                            this.loadServices();\n                        }\n                    }\n                }\n            }\n        }\n    <\/script>\n<\/div>\n    <\/div>\n<\/section>\n\n\n<section aria-label=\"Call to Action\" class=\"cta-section py-14 md:py-28\" style=\"background-color: var(--wp--preset--color--pink-primary);\">\n    <div class=\"container mx-auto px-4 sm:px-8 md:px-16\">\n        <div class=\"max-w-3xl mx-auto flex flex-col items-center text-center\">\n                            <h2 class=\"text-black mb-3\">\n                    Voc\u00ea tem d\u00favidas?  <span>Estamos aqui para ajudar!<\/span>                <\/h2>\n            \n                            <div class=\"text-[16px] md:text-[20px] mx-auto leading-normal mb-6 text-black\">\n                    Use nossa pesquisa baseada em bate-papo para fazer perguntas em qualquer um dos nossos idiomas suportados.                <\/div>\n            \n            <div class=\"flex justify-center\">\n                                    <div class=\"flex justify-start\">\n                        <a href=\"https:\/\/gmsh.ca\/contact\/\"\n                            class=\"bg-black text-white rounded-md px-6 py-3 font-medium no-underline transition-colors duration-300 ease-in-out hover:bg-primary hover:text-white text-sm md:text-base conversational-search-trigger\">\n                            Fa\u00e7a uma pergunta                        <\/a>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/div>\n<\/section>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2241","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Localizar servi\u00e7os - GMSH.ca<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Localizar servi\u00e7os - GMSH.ca\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/\" \/>\n<meta property=\"og:site_name\" content=\"GMSH.ca\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/GMSHAlliance\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-02T21:34:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gmsh.ca\/wp-content\/uploads\/2026\/04\/gmsh-social-share.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@gmshalliance\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/localizar-servicos\\\/\",\"url\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/localizar-servicos\\\/\",\"name\":\"Localizar servi\u00e7os - GMSH.ca\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/#website\"},\"datePublished\":\"2025-05-22T18:06:59+00:00\",\"dateModified\":\"2026-02-02T21:34:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/localizar-servicos\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/localizar-servicos\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/localizar-servicos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Localizar servi\u00e7os\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/#website\",\"url\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/\",\"name\":\"Gay Men\u2019s Sexual Health Alliance (GMSH)\",\"description\":\"Empowering Connection and Well-being for 2SGBTQ+ Men\",\"publisher\":{\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/#organization\"},\"alternateName\":\"GMSH.ca\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/#organization\",\"name\":\"Gay Men\u2019s Sexual Health Alliance (GMSH)\",\"url\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/gmsh.ca\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/gmsh-favicon.png\",\"contentUrl\":\"https:\\\/\\\/gmsh.ca\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/gmsh-favicon.png\",\"width\":340,\"height\":340,\"caption\":\"Gay Men\u2019s Sexual Health Alliance (GMSH)\"},\"image\":{\"@id\":\"https:\\\/\\\/gmsh.ca\\\/pt-br\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/GMSHAlliance\",\"https:\\\/\\\/x.com\\\/gmshalliance\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/gay-men-s-sexual-health-alliance\\\/?originalSubdomain=ca\",\"https:\\\/\\\/www.instagram.com\\\/gaymenssexualhealthalliance\\\/\",\"https:\\\/\\\/www.youtube.com\\\/gaymenssexualhealthalliance\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Localizar servi\u00e7os - GMSH.ca","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/","og_locale":"pt_BR","og_type":"article","og_title":"Localizar servi\u00e7os - GMSH.ca","og_url":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/","og_site_name":"GMSH.ca","article_publisher":"https:\/\/www.facebook.com\/GMSHAlliance","article_modified_time":"2026-02-02T21:34:40+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gmsh.ca\/wp-content\/uploads\/2026\/04\/gmsh-social-share.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@gmshalliance","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/","url":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/","name":"Localizar servi\u00e7os - GMSH.ca","isPartOf":{"@id":"https:\/\/gmsh.ca\/pt-br\/#website"},"datePublished":"2025-05-22T18:06:59+00:00","dateModified":"2026-02-02T21:34:40+00:00","breadcrumb":{"@id":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gmsh.ca\/pt-br\/localizar-servicos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/gmsh.ca\/pt-br\/"},{"@type":"ListItem","position":2,"name":"Localizar servi\u00e7os"}]},{"@type":"WebSite","@id":"https:\/\/gmsh.ca\/pt-br\/#website","url":"https:\/\/gmsh.ca\/pt-br\/","name":"Gay Men\u2019s Sexual Health Alliance (GMSH)","description":"Empowering Connection and Well-being for 2SGBTQ+ Men","publisher":{"@id":"https:\/\/gmsh.ca\/pt-br\/#organization"},"alternateName":"GMSH.ca","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gmsh.ca\/pt-br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/gmsh.ca\/pt-br\/#organization","name":"Gay Men\u2019s Sexual Health Alliance (GMSH)","url":"https:\/\/gmsh.ca\/pt-br\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/gmsh.ca\/pt-br\/#\/schema\/logo\/image\/","url":"https:\/\/gmsh.ca\/wp-content\/uploads\/2026\/01\/gmsh-favicon.png","contentUrl":"https:\/\/gmsh.ca\/wp-content\/uploads\/2026\/01\/gmsh-favicon.png","width":340,"height":340,"caption":"Gay Men\u2019s Sexual Health Alliance (GMSH)"},"image":{"@id":"https:\/\/gmsh.ca\/pt-br\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/GMSHAlliance","https:\/\/x.com\/gmshalliance","https:\/\/www.linkedin.com\/company\/gay-men-s-sexual-health-alliance\/?originalSubdomain=ca","https:\/\/www.instagram.com\/gaymenssexualhealthalliance\/","https:\/\/www.youtube.com\/gaymenssexualhealthalliance"]}]}},"_links":{"self":[{"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/pages\/2241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/comments?post=2241"}],"version-history":[{"count":0,"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/pages\/2241\/revisions"}],"wp:attachment":[{"href":"https:\/\/gmsh.ca\/pt-br\/wp-json\/wp\/v2\/media?parent=2241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}