# Feature SSI-450 - Clarify language around "is" filters

Project: Stream Storage Integrations
Status: in specification
URL: https://community.openproject.org/work_packages/SSI-450

## Planning

| Attribute | Value |
| --- | --- |
| Date |  |
| Priority | Medium |
| Target versions | Product Backlog |
| Votes |  |
| List |  |
| Roadmap |  |
| Relevance |  |

## OPEN POINTS / FEEDBACK

_No work packages_

## Features and Chunks

_No work packages_

## Bugs and other work packages

_No work packages_

## Technical Details

| Attribute | Value |
| --- | --- |
| Module | Modules and project features / Query and filter |
| Feature Flag |  |
| Requires doc change | No |
| Enterprise plan |  |

## Details

| Attribute | Value |
| --- | --- |
| Pull preview |  |
| Mockups |  |
| Accessibility | No |

## People

| Attribute | Value |
| --- | --- |
| Assignee |  |
| Accountable |  |
| Product manager |  |
| Developers | OP Dev Titan Team |
| Designer | Parimal Satyal |
| Ordered by |  |
| Signed off by |  |
| Interest by |  |

## Estimates and progress

| Attribute | Value |
| --- | --- |
| PD (min) |  |
| PD (max) |  |
| Work |  |
| Labor costs |  |

## Description

**As** a user  
**I want to** change the localization of the "is (OR)" filter,  
**so that** I can read the filter in natural language, without understanding for logical operators

**Acceptance criteria**

  - Rename occurences of the `EqualsOr` filter operator to "is any of"
    
      - or "is any" for consistency with "is any with descendants"

  - Rename occurences of the `EqualsAll` filter operator to "includes all of"

  - Rename occurences of `NotEquals` filter operator to "is none of" (single select) / "not all values included in" (multi-select; TBD)
    
      - Discussion: This filter is weird for multi-selects, if my WP has A and B set, only filtering for A or filtering for B does not exclude it, filtering for A and B or A, B and C excludes it. How would you phrase that?
    
      - The filter is easier to understand for single-selects... do we need different names?

<br>

**Technical notes**

  - `Equals` and `EqualsOr` are implemented through the `=` API filter, but the UI sometimes allows selecting many values and sometimes allows to only select one value

**Translation considerations**

Operator names:

<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Operator name</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Logical meaning</p></td><td class="op-uc-table--cell"><p class="op-uc-p">EN (legacy)</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><strong>EN</strong></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><strong>DE</strong></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><strong>FR</strong></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><strong>ES</strong></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Equals (TBD: where is this needed?)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">A OR B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is</p></td><td class="op-uc-table--cell"><p class="op-uc-p">ist</p></td><td class="op-uc-table--cell"><p class="op-uc-p">est</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">EqualsOr</p></td><td class="op-uc-table--cell"><p class="op-uc-p">A OR B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is (OR)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is any of</p></td><td class="op-uc-table--cell"><p class="op-uc-p">ist eines von</p></td><td class="op-uc-table--cell"><p class="op-uc-p">est l'un de</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">EqualsAll</p></td><td class="op-uc-table--cell"><p class="op-uc-p">A AND B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is (AND)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is all of</p></td><td class="op-uc-table--cell"><p class="op-uc-p">ist jedes von</p></td><td class="op-uc-table--cell"><p class="op-uc-p">est la totalité de</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">NotEquals (singular)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">!A AND !B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is not</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is none of</p></td><td class="op-uc-table--cell"><p class="op-uc-p">ist keines von</p></td><td class="op-uc-table--cell"><p class="op-uc-p">n'est aucun de</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">NotEquals (plural)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">!A AND !B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is not</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is not a subset of</p></td><td class="op-uc-table--cell"><p class="op-uc-p">ist keine Untermenge von</p></td><td class="op-uc-table--cell"><p class="op-uc-p">n'est pas inclus dans? /<br>n'est pas un sous-ensemble?</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">NotEquals (generic)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">!A AND !B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is not</p></td><td class="op-uc-table--cell"><p class="op-uc-p">-</p></td><td class="op-uc-table--cell"><p class="op-uc-p">-</p></td><td class="op-uc-table--cell"><p class="op-uc-p">-</p></td><td class="op-uc-table--cell"><p class="op-uc-p">-</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">- (plural)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">!A OR !B</p></td><td class="op-uc-table--cell"><p class="op-uc-p">-</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is not all of</p></td><td class="op-uc-table--cell"><p class="op-uc-p">is nicht jedes von</p></td><td class="op-uc-table--cell"><p class="op-uc-p">n'est pas la totalité de</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr></tbody></table></figure>

**Screenshots**

<img class="op-uc-image op-uc-image_inline" src="/api/v3/attachments/894321/content">

**Out of scope**

  - Considerations for other filters (such as descendants, contains, etc)

  - Implementing new filters that don't exist yet (e.g. "is not all of")
